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

如何将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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 21:26:15