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更简洁直接。
步骤示例:
- 构造示例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)
- 执行格式转换:
# 调用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)
- 最终输出结果:
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
相关产品推荐
相关产品推荐

