Pandas中分组统计后转置DataFrame导致count()结果异常的修复方案咨询
解决df1分组统计type出现次数并合并到df2的问题
你的问题根源在于混淆了groupby后的count()和size()方法:count()会逐列统计非空值的数量,而你实际需要的是每个type分组的总行数,不管某列是否有NULL值。
修复步骤详解:
正确统计每个type的出现次数
用size()替代count(),它直接返回每个分组的总行数,完美适配你的需求:# 统计每个type的总行数,返回Series type_counts = df1.groupby('type').size() # 转换为DataFrame并重置索引,方便后续处理 type_counts_df = type_counts.reset_index(name='total_count')这一步会得到:
type total_count A 2 B 1 转换为你需要的宽表格式(count_A、count_B)
用pivot把长表转成宽表,并用fillna(0)处理可能缺失的type(如果后续有新type也能兼容):# 转宽表,填充缺失值为0并转为整数 type_pivot = type_counts_df.pivot(columns='type', values='total_count').fillna(0).astype(int) # 添加前缀,生成count_A、count_B列名 type_pivot = type_pivot.add_prefix('count_') # 重置索引,确保和df2的索引对齐 type_pivot = type_pivot.reset_index(drop=True)合并到df2
因为df2和统计结果都是单一行,直接用pd.concat按列合并即可:import pandas as pd # 合并两个DataFrame final_df = pd.concat([df2, type_pivot], axis=1)
最终结果
运行后你会得到期望的格式:
| name | value | count_A | count_B |
|---|---|---|---|
| Name1 | 23 | 2 | 1 |
为什么原来的代码出错?
你之前用groupby('type').count()时,它会对每一列单独统计非空值:
- 对于
fake_id列,type B的行是NULL,所以count为0 - 对于
date列,type B的行有值,count为1
而size()不关心列是否为空,只统计分组内的总行数,这才是你需要的“出现次数”。
内容的提问来源于stack exchange,提问作者Jnl
相关产品推荐
相关产品推荐

