Ошибка типа: не удается преобразовать тип ‘NoneType’ в числитель / знаменатель

#python #pandas #csv

#python #панды #csv

Вопрос:

Здесь я пытаюсь вычислить среднее значение на основе данных в двух списках dict . Хотя я использовал тот же код раньше, я продолжаю получать ошибку. Есть ли какое-либо решение?

 import pandas as pd
data = pd.read_csv('data3.csv',sep=';') # Reading data from csv
data = data.dropna(axis=0) # Drop rows with null values
data = data.T.to_dict().values() # Converting dataframe into list of dictionaries
newdata = pd.read_csv('newdata.csv',sep=';') # Reading data from csv
newdata = newdata.T.to_dict().values() # Converting dataframe into list of dictionaries

score = []
for item in newdata:
  score.append({item['Genre_Name']:item['Ranking']})


from statistics import mean
score={k:int(v) for i in score for k,v in i.items()}  

for item in data:
  y= mean(map(score.get,map(str.strip,item['Recommended_Genres'].split(','))))

print(y)
 

Также смотрите файлы csv: https://repl.it/@rmakakgn/SVE2

Ответ №1:

.get метод dict возврата None если данный ключ не существует и statistics.mean из-за этого выходит из строя, учтите, что

 import statistics
d = {"a":1,"c":3}
data = [d.get(x) for x in ("a","b","c")]
print(statistics.mean(data))
 

результат:

 TypeError: can't convert type 'NoneType' to numerator/denominator
 

Вам необходимо удалить None s перед вводом statistics.mean , что вы можете сделать, используя понимание списка:

 import statistics
d = {"a":1,"c":3}
data = [d.get(x) for x in ("a","b","c")]
data = [i for i in data if i is not None]
print(statistics.mean(data))
 

или filter :

 import statistics
d = {"a":1,"c":3}
data = [d.get(x) for x in ("a","b","c")]
data = filter(lambda x:x is not None,data)
print(statistics.mean(data))
 

(будут напечатаны оба фрагмента кода выше 2 )

В этом конкретном случае вы можете получить эффект фильтра, заменив:

 mean(map(score.get,map(str.strip,item['Recommended_Genres'].split(','))))
 

с:

 mean([i for i in map(score.get,map(str.strip,item['Recommended_Genres'].split(','))) if i is not None])
 

хотя, как и в случае с большинством встроенных в python и стандартных библиотечных функций, принимающих список в качестве единственного аргумента, вы можете решить не создавать список, а напрямую передавать созданный генератор, т.е.

 mean(i for i in map(score.get,map(str.strip,item['Recommended_Genres'].split(','))) if i is not None)
 

Для дальнейшего обсуждения см. PEP 202 xor или PEP 289.

Комментарии:

1. Можете ли вы объяснить понимание списка на основе моих данных? Для меня это действительно сложно