如何将Pandas宽数据框转换为长数据框?附实操示例
问题描述
给定如下宽格式Pandas数据框:
import pandas as pd data1 = {'pair': ['(x,y)', '(x,z)', '(u,v)', '(u,w)'], 'A_1': [1, 4, 7, 5], 'A_2': [2, 5, 8, 7], 'A_3': [3, 6, 9, 1], 'B_1': [7, 0, 1, 0], 'B_2': [2, 1, 4, 4], 'B_3': [5, 3, 6, 3]} df = pd.DataFrame(data1)
原始数据展示:
pair A_1 A_2 A_3 B_1 B_2 B_3 0 (x,y) 1 2 3 7 2 5 1 (x,z) 4 5 6 0 1 3 2 (u,v) 7 8 9 1 4 6 3 (u,w) 5 7 1 0 4 3
需要转换为以下长格式数据框:
pair A B 0 (x,y) 1 7 1 (x,y) 2 2 2 (x,y) 3 5 3 (x,z) 4 0 4 (x,z) 5 1 5 (x,z) 6 3 6 (u,v) 7 1 7 (u,v) 8 4 8 (u,v) 9 6 9 (u,w) 5 0 10 (u,w) 7 4 11 (u,w) 1 3
解决方案
方法1:使用pd.wide_to_long(推荐)
这个方法专门针对列名带"前缀_后缀"格式的宽表,一步完成拆分转换:
# 执行宽转长 df_long = pd.wide_to_long(df, stubnames=['A', 'B'], i='pair', j='idx', sep='_', suffix=r'\d+') # 重置索引并删除临时的idx列 df_long = df_long.reset_index().drop('idx', axis=1)
运行后得到的结果完全符合目标格式。
方法2:使用melt+pivot(逻辑更直观)
如果对wide_to_long不熟悉,可通过以下分步操作实现:
# 1. 将所有数值列转为长格式 df_melt = df.melt(id_vars='pair', var_name='col', value_name='val') # 2. 拆分列名为类型(A/B)和序号(1/2/3) df_melt[['type', 'idx']] = df_melt['col'].str.split('_', expand=True) # 3. 按pair和idx分组,将type转为列 df_pivot = df_melt.pivot(index=['pair', 'idx'], columns='type', values='val').reset_index() # 4. 清理临时列并调整顺序 df_pivot = df_pivot.drop('idx', axis=1)[['pair', 'A', 'B']]
内容的提问来源于stack exchange,提问作者Red shoes
相关产品推荐
相关产品推荐

