如何将pandas DataFrame从现有结构转换为目标结构
pandas DataFrame 宽表转目标结构实现方案
你需要的是把列名带「国家+指标」复合信息的宽表,转换为按维度规整的标准表,直接按下面的步骤操作即可:
- 核心逻辑分两步:先把所有数值列打平为长表拆分出国家、指标维度,再把指标转回单独列。
- 完整代码如下,把对应变量名替换成你自己的表名、列名就行:
import pandas as pd # 1. 宽表转长表,id_vars里放所有不需要转置的公共维度列,比如年份、月份这类 df_long = df.melt( id_vars=["年份"], var_name="country_metric", value_name="value" ) # 2. 拆分复合列名,拿到国家、具体指标两个字段,如果你的列名分隔符不是下划线就换成对应符号 df_long[["国家", "指标"]] = df_long["country_metric"].str.split("_", expand=True) # 3. 把指标字段转回列,得到目标结构 df_result = df_long.pivot( index=["年份", "国家"], columns="指标", values="value" ).reset_index() # 清理列名多余的索引标签 df_result.columns.name = None
注意事项:如果你的公共维度不止年份(比如还有季度、行业字段),直接把字段名加到
id_vars和pivot的index参数列表里即可;如果转换后有空值,按业务需求用fillna()填充对应值就行。
可以用测试数据验证效果:
# 构造和原始结构一致的测试表 df = pd.DataFrame({ "年份": [2020, 2021, 2022], "阿根廷_食品出口": [102, 124, 157], "阿根廷_能源出口": [83, 92, 116], "巴西_食品出口": [211, 235, 272], "巴西_能源出口": [154, 172, 209] }) # 执行上述转换后输出的结果,每行对应一个年份+一个国家,食品出口、能源出口各自为独立列,和目标结构完全一致
内容的提问来源于stack exchange,提问作者Lautaro
相关产品推荐
相关产品推荐

