我试图编写一个函数来查找属于仅属于特定类的值的属性的平均值。
以下是我的代码:
`mean=0
total=0
count=0
for i in range(len(training_data)):
if (training_data[i,334])==0:
if training_data[i,2]<>None:
total+=training_data[i,2]
count+=1
mean=total/count`
但是,我的属性中有一些空值。我正在使用numpy,并且空值被编码为&#34; NaN&#34;。在我上面的函数中,即使我特别指定值不能等于&#34;无&#34;,这是Python相当于null,我的&#34;总计&#34;属性继续显示为&#39; nan&#39;。我已经尝试了很多不同的等价物#34;无&#34;除了&#39; nan&#39;之外,还无法获得总变量的值。我有什么明显的遗失吗?提前谢谢!
答案 0 :(得分:1)
凭借numpy
的强大功能,您的代码可以修剪为2行:
idx = training_data[:,334] == 0
mean = np.nanmean(training_data[idx, 2])
idx
这里是布尔数组,对于属于特定类的行的索引是True
,np.nanmean
计算忽略NaN的平均值。
答案 1 :(得分:0)
首先,this answer中建议的numpy解决方案更适合于循环。
在这里,我将回答明确的问题:
[我]无法获得除'nan'之外的总变量的值。有什么明显的东西我不见了吗?
您无法直接比较nan
。表达式np.nan != np.nan
始终会生成True
,np.nan == np.nan
始终会生成False
。换句话说, nan不等于它自己。
这意味着,如果您使用==
或!=
来检查nan,则代码认为该值不是nan并将其添加到结果中。当你向任何东西添加nan时,结果就是nan,这就是你得到的。
要正确检查值是否为nan,您可以使用math.isnan()
或np.isnan()
。
编辑:我假设数据中的NaN值被编码为nan
。实际上,这个问题并不完全清楚。如果它们被编码为"nan"
字符串或None
,则需要稍微不同的处理。