Python pandas:转置现有DataFrame创建自定义格式DataFrame
实现方案
你要做的是宽表转长表+指标列透视,两步pandas操作就能得到预期结果,不需要复杂自定义逻辑。
你的原始数据结构如下:
原始表中Country(国家)、Indicator(指标)是固定维度列,其余列均为年份维度的数值列,转换分两步走:
- 第一步用
melt把分散的年份列合并为单个Year列
import pandas as pd # 固定国家、指标为id列,其余年份列打平 df_step1 = df.melt( id_vars=["Country", "Indicator"], var_name="Year", value_name="metric_value" )
这一步输出的表结构为4列:Country/Indicator/Year/metric_value,每一行对应「某国家+某年+某指标」的单条数值。
2. 第二步用pivot把Indicator列的5个指标转为独立列
# 以国家、年份为行索引,把不同指标值展开为单独列 df_result = df_step1.pivot( index=["Country", "Year"], columns="Indicator", values="metric_value" ).reset_index() # 清掉透视带来的列名层级,恢复普通二维表结构 df_result.columns.name = None
最终输出结构和你预期完全一致:
注意事项
- 如果你的原始数据存在「同一国家+同一年份+同一指标」的重复条目,把
pivot替换为pivot_table,指定聚合规则即可,例如pd.pivot_table(..., aggfunc="first") - 转换后行数校验:如果有N个国家、10个年份,最终输出行数固定为
N*10,每个国家对应10条年份记录,和你要求的重复规则匹配。 - 如果想简化写法,也可以直接用
pd.wide_to_long完成第一步年份合并,逻辑和melt等价,适合列名规则高度统一的数据集。
内容的提问来源于stack exchange,提问作者Florence Barre
相关产品推荐
相关产品推荐

