使用pandas.groupby后列重命名及统计子项数量转宽表的问题
问题解决方案
1. 解决分组计数后的列重名问题
你当前的写法是对单列ChildName做count运算,得到的Series默认名称和原列名一致,转DataFrame后就会和索引层级的ChildName重名,两种修正方案:
- 方案A:分组计数后用
reset_index直接指定计数列名,同时把多级索引转为普通列
by_parent = df.groupby(["ParentName", "ChildName"])["ChildName"].count().reset_index(name="child_count")
- 方案B:聚合时直接通过
agg指定列名,可读性更强
by_parent = df.groupby(["ParentName", "ChildName"], as_index=False).agg( child_count = ("ChildName", "count") )
2. 生成要求格式的宽表
两种实现路径可选:
路径1:基于上述聚合结果做透视
调用pivot方法完成行转列,再通过add_prefix给列名加指定前缀,缺失计数补0即可:
wide_df = by_parent.pivot( index="ParentName", columns="ChildName", values="child_count" ).add_prefix("child_").reset_index().fillna(0)
路径2:一步生成最终宽表
无需提前做分组聚合,直接用pd.crosstab统计频次即可,代码更简洁:
wide_df = pd.crosstab(df["ParentName"], df["ChildName"]).add_prefix("child_").reset_index()
该方法默认就会统计每个ParentName下各ChildName的出现次数,和需求完全匹配。
内容的提问来源于stack exchange,提问作者ek11222
相关产品推荐
相关产品推荐

