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

如何用Pandas按分组统计NA与非NA值的数量

Pandas分组统计NA与有效值频次解决方案

方法一:使用pd.crosstab快速实现

先给数据新增状态列区分有效值和NA,再通过交叉表完成分组统计,最后添加总计列:

# 标记每个值的状态:Valid(非NA)或NA
df['Status'] = df['Val'].apply(lambda x: 'NA' if pd.isna(x) else 'Valid')

# 生成交叉表,按状态和分组统计频次
result = pd.crosstab(df['Status'], df['Group'])

# 添加Total列,计算每行的总和
result['Total'] = result.sum(axis=1)

print(result)

输出结果:

A  B  Total
Valid  3  2      5
NA     1  2      3

方法二:groupby+自定义聚合实现

通过分组聚合直接计算每个分组的有效值和NA值数量,转置后调整格式,再添加总计:

# 分组聚合,统计每个Group的Valid和NA数量
agg_result = df.groupby('Group')['Val'].agg(
    Valid=lambda x: x.notna().sum(),
    NA=lambda x: x.isna().sum()
).T  # 转置行和列,让状态作为行索引

# 添加Total列
agg_result['Total'] = agg_result.sum(axis=1)

print(agg_result)

输出结果与方法一完全一致。

关于你之前尝试的问题说明

你之前的两种分组操作都没有完成聚合计数:

  • groupby.agg(lambda x: x.isna())返回的是每个分组内所有元素的布尔值列表,没有对布尔值求和统计数量;
  • groupby.apply(lambda x: x.isna())是对分组内的每一行返回布尔值,没有做聚合统计。

要得到频次,需要对布尔值调用sum()(True等价于1,False等价于0,求和即得到对应频次)。

内容的提问来源于stack exchange,提问作者buhtz

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 01:50:34