如何将宽格式DataFrame转换为国家-年份-值的长格式?
Pandas实现宽格式DataFrame转长格式
可以用Pandas的melt()函数快速实现宽格式到长格式的转换,以下是具体步骤和代码:
1. 构造示例宽格式数据
先模拟你提供的多国家宽格式DataFrame:
import pandas as pd # 示例宽格式数据,行是国家,列是年份 wide_df = pd.DataFrame( data={'Year1': ['x1', 'y1'], 'Year2': ['x2', 'y2'], 'Year3': ['x3', 'y3']}, index=['canada.', 'usa.'] # 模拟带标点的国家名 )
2. 执行宽转长转换
# 把索引转为普通列,再用melt转换 long_df = wide_df.reset_index().melt( id_vars='index', # 指定作为标识的列(原国家索引) var_name='Year', # 原年份列名存入新列Year value_name='Value' # 原数值存入新列Value ).rename(columns={'index': 'Country'}) # 重命名标识列为Country # 处理国家名:去掉末尾标点并首字母大写 long_df['Country'] = long_df['Country'].str.strip('.').str.capitalize()
3. 转换结果
最终得到的long_df结构如下:
| Country | Year | Value |
|---|---|---|
| Canada | Year1 | x1 |
| Usa | Year1 | y1 |
| Canada | Year2 | x2 |
| Usa | Year2 | y2 |
| Canada | Year3 | x3 |
| Usa | Year3 | y3 |
关键函数说明
reset_index():将原DataFrame的索引(国家)转换为普通列,方便后续作为标识列处理melt():Pandas专门用于宽转长的函数,id_vars指定保留的分组列,var_name和value_name分别定义转换后的列名str.strip('.'):清理国家名中的多余标点,可根据实际情况调整符号str.capitalize():将国家名格式化为首字母大写的形式,匹配示例要求
内容的提问来源于stack exchange,提问作者Aroune
相关产品推荐
相关产品推荐

