如何用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
相关产品推荐
相关产品推荐

