将分类列转换为多计数列:解决Pandas多级索引问题
解决Pandas分类计数列扩展及多级索引问题
一、处理现有多级索引的方案
你当前生成的pivoted数据存在两层列索引(顶层为count,底层是分类名称),可以通过以下步骤清理:
- 移除列的顶层索引:
# 去掉列的顶层"count"索引 pivoted.columns = pivoted.columns.droplevel(0)
- 将
person_id从索引转为普通列,同时把NaN填充为0(计数场景下0更符合逻辑):
final_result = pivoted.reset_index().fillna(0).astype({'bad': int, 'new': int, 'ok': int})
处理后结果如下:
| person_id | bad | new | ok |
|---|---|---|---|
| person_a | 0 | 2 | 0 |
| person_b | 1 | 0 | 1 |
| person_c | 1 | 1 | 0 |
二、更简洁的一步到位实现方法
不需要先分组统计再转置,直接用Pandas内置函数就能完成需求:
方法1:使用pivot_table
指定行、列、聚合规则,一步生成目标格式:
final_result = df.pivot_table( index='person_id', columns='categorical_data', aggfunc='size', # 统计每组的行数(即频次) fill_value=0 ).reset_index()
方法2:使用pd.crosstab
这是专门用于交叉计数的函数,代码更简洁:
final_result = pd.crosstab(df['person_id'], df['categorical_data']).reset_index()
这两种方法都会直接生成无多级索引的结果,且自动把缺失的计数填充为0,省去后续索引清理步骤。
内容的提问来源于stack exchange,提问作者MrChomp
相关产品推荐
相关产品推荐

