如何将宽格式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
相关产品推荐
相关产品推荐

