使用Pandas统计DataFrame列中NaN次数时遇KeyError问题求助
嘿,我来帮你搞定这个报错!你遇到的KeyError: 'Level NaN must be same as name (None)',根源是你用错了count()方法的用法。
为什么会报错?
Pandas里Series.count()(你这里enron_df.loc['salary']返回的是一个Series)的作用是统计非缺失值的数量,而且它的参数不是用来指定要统计的目标值的。你传入'NaN'后,Pandas会把它当成要进行分组的级别名称,这和你的DataFrame结构不匹配,所以才抛出了这个奇怪的KeyError。
正确的几种统计NaN次数的方法
这里给你几个实用的方案:
最简洁的方法:用
isna().sum()
先通过isna()把每个元素转换成布尔值(NaN对应True,非NaN对应False),再用sum()统计True的数量(因为True在Python中等价于1):count = enron_df['salary'].isna().sum()(如果习惯用旧方法,
isnull()和isna()是完全等价的,也可以写成enron_df['salary'].isnull().sum())用
value_counts包含NaN统计
如果你想同时看到所有值的分布(包括NaN),可以用value_counts()并设置dropna=False,再提取NaN的计数:import numpy as np count = enron_df['salary'].value_counts(dropna=False).get(np.nan, 0)这里
get(np.nan, 0)是为了防止如果没有NaN的话返回0,避免KeyError。另一种思路:总数量减去非缺失值数量
既然count()是统计非缺失值,那总行数减去它的结果就是NaN的数量:count = len(enron_df['salary']) - enron_df['salary'].count()
另外提一句,如果你要取salary列,直接用enron_df['salary']比enron_df.loc['salary']更常规(除非salary是你的行索引名称,但看起来应该是列名)。
内容的提问来源于stack exchange,提问作者Ian Dzindo

