You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.28 19:27:36