You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将宽格式DataFrame转换为含country、year、hdi的长格式表?

宽格式转长格式的正确方法(附问题说明)

这不属于单纯的转置问题,而是宽格式数据转长格式的典型数据重塑需求——转置只是简单互换行列,而你需要的是把分散在列上的年份信息提取为行维度,同时对应到每个国家的HDI值,最终得到三列结构。

正确实现方式(基于Pandas)

假设你的原始数据结构是:第一列为country,后续列的列名是年份(比如1990、1991...),单元格值为对应国家对应年份的HDI。

方法1:使用melt(最通用)

这是宽转长的标准工具,直接指定保留的标识列、新列的名称即可:

import pandas as pd

# 替换成你的实际数据框名称
long_format_df = df.melt(
    id_vars='country',  # 要保留的列(每个行组的标识)
    var_name='year',    # 原年份列名要转换为的新列名
    value_name='hdi'    # 原单元格HDI值要转换为的新列名
)

方法2:使用wide_to_long(适合列名有统一前缀的情况)

如果你的年份列名带前缀(比如HDI_1990、HDI_1991),用这个方法更高效:

long_format_df = pd.wide_to_long(
    df,
    stubnames='hdi',  # 列名的统一前缀部分
    i='country',      # 行标识列
    j='year',         # 要提取的维度名称(年份)
    sep='_'           # 列名前缀和年份的分隔符
).reset_index()  # 将索引中的country和year转为普通列

你之前尝试的方法为什么无效

  • df.groupby('country').T:分组转置会把每个国家的行转成列,得到的结构是年份作为行索引、国家作为列,完全不符合你要的三列格式。
  • df['country'] = df.iloc[0]:这是把第一行的国家名称赋值给整个country列,会导致所有行的国家都变成同一个值,显然错误。

内容的提问来源于stack exchange,提问作者S.H

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 12:45:43