Python中DataFrame按指定变量分组后统计各分组NA值数量的实现方法
解决Python分组统计DataFrame各变量NA值数量的问题
嗨,我明白你想要的效果——按指定变量分组后,直接统计每个分组里各列的缺失值(NA)数量,而不是用总观测数减去非NA数。你之前踩的坑我也遇到过,咱们一步步来解决:
为什么之前的方法报错?
df.groupby("var1").isnull() 这类写法行不通,是因为groupby()返回的是GroupBy对象,它本身没有isnull()/isna()方法。你得通过apply()或agg()来对每个分组的子DataFrame做缺失值统计。
对应R代码的Python实现
你提到的R代码 dat%>%group_by(citizenship)%>%summarise_all(funs(sum(is.na(.)))),在Python里有几种等价的实现,最直接的是用groupby().agg()结合lambda函数:
import pandas as pd # 假设你的DataFrame名为df na_count_by_group = df.groupby('citizenship').agg(lambda x: x.isna().sum())
更高效的向量式写法(适合大数据集)
如果你的DataFrame数据量很大,推荐用先全量标记缺失值,再分组求和的方式,比lambda+agg更高效:
na_count_by_group = pd.isna(df).groupby(df['citizenship']).sum()
示例验证
我们用一个小数据集测试一下:
# 构造示例DataFrame data = { 'citizenship': ['USA', 'USA', 'Canada', 'Canada', 'USA'], 'age': [25, None, 30, None, 40], 'income': [50000, 60000, None, 70000, None] } df = pd.DataFrame(data) # 执行统计 result = df.groupby('citizenship').agg(lambda x: x.isna().sum()) print(result)
输出结果完全符合你的需求:
age income citizenship Canada 1 1 USA 1 1
另一种写法:用groupby.apply()
如果你习惯用apply(),也可以这样写,效果和上面一致:
na_count_by_group = df.groupby('citizenship').apply(lambda x: x.isna().sum())
这样就能得到和R代码完全对应的分组缺失值统计结果啦!
内容的提问来源于stack exchange,提问作者darjeely
相关产品推荐
相关产品推荐

