如何在Python中使用多重索引实现数据分组与透视?
实现按Area分组统计多Job字段取值次数的多级列索引DataFrame
完整解决方案代码
import pandas as pd data_input = {'Area':['North', 'South', 'West', 'East','North', 'South', 'West', 'East'], "Job1":["T", "F", "T", "X","T", "F", "T", "X"], "Job2":["F", "X", "T", "X","T", "F", "T", "X"], "Job3":["T", "F", "T", "X","X", "X", "F", "T"]} df1 = pd.DataFrame(data_input) # 仅保留需要统计的Job字段(可选,若不需要Job3则添加此参数) target_jobs = ['Job1', 'Job2'] # 宽格式转长格式,拆分Job字段和对应取值 melted_df = df1.melt(id_vars='Area', var_name='Job', value_name='Value', value_vars=target_jobs) # 分组统计次数并重塑为多级列索引 result = melted_df.groupby(['Area', 'Job', 'Value']).size() \ .unstack(level=['Job', 'Value'], fill_value=0) # 匹配期望的列顺序和行顺序 desired_columns = [('Job1', 'T'), ('Job1', 'F'), ('Job1', 'X'), ('Job2', 'T'), ('Job2', 'F'), ('Job2', 'X')] desired_index = ['North', 'South', 'East', 'West'] result = result.reindex(columns=desired_columns).reindex(index=desired_index) print(result)
步骤说明
- 格式转换:使用
melt将原DataFrame的宽格式转为长格式,把每个Job字段的名称和取值拆分为单独列,便于后续分组统计。如果不需要统计Job3,可通过value_vars指定目标Job字段。 - 分组统计:通过
groupby按Area、Job、Value三级分组,用size()计算每组的出现次数,再用unstack将Job和Value转换为列的多级索引,fill_value=0确保未出现的取值组合显示为0。 - 索引调整:用
reindex分别调整列顺序和行顺序,完全匹配期望输出的结构。
运行上述代码后,得到的结果与你提供的期望输出完全一致。
内容的提问来源于stack exchange,提问作者Namra
相关产品推荐
相关产品推荐

