如何在Pandas中将长格式DataFrame转换为宽格式
Pandas长格式转宽格式实现方案
针对你给出的长格式DataFrame,我们可以通过Pandas的pivot方法结合列名整理来实现转换,具体步骤如下:
1. 构造示例数据(可直接复用测试)
先还原你的DataFrame结构:
import pandas as pd data = { 'GEO_NAME': ['60010188']*5, 'CHARACTERISTIC_NAME': ['0 to 14 years', '15 to 19 years', '20 to 24 years', '25 to 29 years', '30 to 34 years'], 'C1_COUNT_TOTAL': [105.0, 30.0, 20.0, 35.0, 35.0], 'C2_COUNT_MEN+': [50.0, 15.0, 10.0, 15.0, 15.0], 'C3_COUNT_WOMEN+': [50.0, 15.0, 15.0, 20.0, 20.0] } df = pd.DataFrame(data)
2. 执行转换操作
核心是用pivot将行维度的CHARACTERISTIC_NAME转为列维度,再合并多层列名:
# 1. 执行pivot,生成多层列结构 pivoted_df = df.pivot(index='GEO_NAME', columns='CHARACTERISTIC_NAME') # 2. 整理列名:将(计数类型, 年龄组)的结构转为"年龄组_计数类型" # 定义原列名到目标后缀的映射 col_mapping = { 'C1_COUNT_TOTAL': 'TOTAL', 'C2_COUNT_MEN+': 'MEN', 'C3_COUNT_WOMEN+': 'WOMEN' } # 合并多层列名 pivoted_df.columns = pivoted_df.columns.map(lambda x: f"{x[1]}_{col_mapping[x[0]]}") # 3. 重置索引,让GEO_NAME回到普通列 final_df = pivoted_df.reset_index()
3. 转换结果
执行后得到的final_df结构如下:
GEO_NAME 0 to 14 years_TOTAL 0 to 14 years_MEN 0 to 14 years_WOMEN 15 to 19 years_TOTAL 15 to 19 years_MEN 15 to 19 years_WOMEN 20 to 24 years_TOTAL 20 to 24 years_MEN 20 to 24 years_WOMEN 25 to 29 years_TOTAL 25 to 29 years_MEN 25 to 29 years_WOMEN 30 to 34 years_TOTAL 30 to 34 years_MEN 30 to 34 years_WOMEN 0 60010188 105.0 50.0 50.0 30.0 15.0 15.0 20.0 10.0 15.0 35.0 15.0 20.0 35.0 15.0 20.0
关键说明
- 如果你的DataFrame包含多个
GEO_NAME,该方法同样适用,每个地理区域会自动合并为一行 - 若存在重复的
GEO_NAME+CHARACTERISTIC_NAME组合,可改用pivot_table并指定聚合函数(如aggfunc='sum')处理重复值
内容的提问来源于stack exchange,提问作者Winston Li
相关产品推荐
相关产品推荐

