类型错误:无法将类型"NoneType"转换为分子/分母



在这里,我试图根据dicts的两个列表中的数据来计算平均值。尽管我以前使用过相同的代码,但我总是出错。有什么解决办法吗?

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

dict.get方法返回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

在输入statistics.mean之前,您需要删除None,这可以使用列表理解:来完成

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或PEP 289。

最新更新