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

Python pandas:如何将多组Item-Value列转换为两列格式?

宽格式数据集转长格式(Group-Item-Value)

原数据集格式:

Group   Item1   Value1  Item2   Value2  …… Item10  Value10
 A      apple     2     pears     -4    
 B      orange   -5     banana     3    
 C      grapes    6     apple     -8    
 D      pears     8     orange     1    

需要转换为仅包含Group、Item、Value三列的长格式,每行对应一组Item-Value对:

Group   Item     Value
 A      apple      2
 A      pears     -4
 B      orange    -5
 B      banana     3
 C      grapes     6
 C      apple     -8
 ...    ...       ...

以下是针对该需求的可行解决方案:


最优方案:使用pandas.wide_to_long

这个方法专门适配这种前缀+序号的成对列(如Item1/Value1、Item2/Value2),比melt更简洁直接。

步骤示例:

  1. 构造示例DataFrame(模拟你的原始数据):
import pandas as pd

data = {
    'Group': ['A', 'B', 'C', 'D'],
    'Item1': ['apple', 'orange', 'grapes', 'pears'],
    'Value1': [2, -5, 6, 8],
    'Item2': ['pears', 'banana', 'apple', 'orange'],
    'Value2': [-4, 3, -8, 1]
    # 可继续添加Item3/Value3...Item10/Value10列
}
df = pd.DataFrame(data)
  1. 执行格式转换:
# 调用wide_to_long处理成对列
df_long = pd.wide_to_long(
    df,
    stubnames=['Item', 'Value'],  # 指定列名的前缀(Item、Value)
    i='Group',  # 保留的标识列(分组列)
    j='pair_num',  # 生成的临时序号列(标记是第N组Item-Value)
    sep=''  # 列名中前缀与序号的分隔符(这里无分隔符,如Item1是Item+1)
).reset_index()

# 不需要临时序号列的话直接删除
df_long = df_long.drop('pair_num', axis=1)
  1. 最终输出结果:
Group    Item  Value
0     A   apple      2
1     A   pears     -4
2     B  orange     -5
3     B  banana      3
4     C  grapes      6
5     C   apple     -8
6     D   pears      8
7     D  orange      1

补充:用melt的实现方式

如果坚持要用melt,需要分两次提取Item和Value列再合并,步骤相对繁琐:

# 提取所有Item列
items = df.melt(id_vars='Group', value_vars=[col for col in df.columns if 'Item' in col], var_name='Item_num', value_name='Item')
# 提取所有Value列
values = df.melt(id_vars='Group', value_vars=[col for col in df.columns if 'Value' in col], var_name='Value_num', value_name='Value')
# 提取序号并合并
items['num'] = items['Item_num'].str.extract('(\d+)')
values['num'] = values['Value_num'].str.extract('(\d+)')
df_long = pd.merge(items, values, on=['Group', 'num']).drop(['Item_num', 'Value_num', 'num'], axis=1)

内容的提问来源于stack exchange,提问作者sam

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 10:07:29