如何重排Pandas DataFrame:将年份列转为行、var字段转为新列
实现思路与代码
你的需求可以通过Pandas的「长/宽格式转换」两步完成,逻辑清晰好理解,适合初学者掌握:
- 先把原始表中横向排布的Yr1、Yr2、Yr3列转为纵向行,提取年份数字
- 再把var列的v1、v2、v3取值转为横向列,即可得到目标结构
完整可运行代码
import pandas as pd # 原始DataFrame d = {'name': ['a', 'a','a','b','b','b'], 'var': ['v1', 'v2', 'v3', 'v1', 'v2', 'v3'], 'Yr1': [11, 21, 31, 41, 51, 61], 'Yr2': [12, 22, 32, 42, 52, 62], 'Yr3': [13, 23, 33, 43, 53, 63]} df = pd.DataFrame(d) # 第一步:把Yr开头的列从宽格式转为长格式,提取年份数字 df_melted = df.melt(id_vars=['name', 'var'], var_name='Yr', value_name='val') df_melted['Yr'] = df_melted['Yr'].str.replace('Yr', '').astype(int) # 第二步:把var列的v1/v2/v3转为独立列,得到目标结构 df_result = df_melted.pivot(index=['name', 'Yr'], columns='var', values='val').reset_index() # 清除列名标记,输出更整洁 df_result.columns.name = None print(df_result)
代码说明
melt:保留name、var两列不动,把所有Yr开头的列转为纵向排布,原列名存入Yr列,原单元格值存入val列- 替换
Yr前缀:把Yr1、Yr2转换为纯数字1、2、3,匹配目标表的Yr列格式 pivot:以name和Yr为分组依据,把var列的不同取值转为独立列,对应值填充到对应单元格中reset_index:把name、Yr从索引变回普通列,得到最终符合要求的表结构
内容的提问来源于stack exchange,提问作者A A
相关产品推荐
相关产品推荐

