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

如何用Pandas将DataFrame多列同时融合为两行?

Pandas DataFrame多列结构化转换

原始DataFrame结构

ID ID2 ID3 R_u L_u R_sd L_sd
1  F   G1   x   y   z    t
2  M   G2   x   y   z    t

目标转换后结构

ID ID2 ID3 Side u sd
1  F   G1   R    x z
1  F   G1   L    y t 
2  M   G2   R    x z
2  M   G2   L    y t 

用户尝试使用pandas.melt处理,但仅能单独处理R_u/L_u这类列,无法同时批量处理多组(如u和sd两组)列,希望实现自动化转换。


最优解决方案:使用pd.wide_to_long

这种场景下,pd.wide_to_long比melt更适配,它能自动识别列名中的前缀(R/L)和后缀(u/sd),一次性完成宽表转长表的结构化转换:

import pandas as pd

# 构造示例DataFrame
df = pd.DataFrame({
    'ID': [1, 2],
    'ID2': ['F', 'M'],
    'ID3': ['G1', 'G2'],
    'R_u': ['x', 'x'],
    'L_u': ['y', 'y'],
    'R_sd': ['z', 'z'],
    'L_sd': ['t', 't']
})

# 执行转换
df_result = pd.wide_to_long(
    df,
    stubnames=['u', 'sd'],  # 指定需要转换的指标列后缀
    i=['ID', 'ID2', 'ID3'],  # 保留的标识列
    j='Side',  # 新生成的前缀对应列名
    sep='_',  # 列名中前缀与后缀的分隔符
    suffix='.'  # 匹配后缀的正则规则,.表示匹配任意字符
).reset_index()

print(df_result)

执行后输出:

ID ID2 ID3 Side  u sd
0   1   F  G1    R  x  z
1   1   F  G1    L  y  t
2   2   M  G2    R  x  z
3   2   M  G2    L  y  t

如果后续新增类似R_xx/L_xx的列,只需扩展stubnames参数即可,完全实现自动化处理。


备选方案:多次melt后合并

如果坚持使用melt,可以分两次处理不同指标列,再通过标识列合并:

# 处理u列并提取Side
melt_u = df.melt(
    id_vars=['ID', 'ID2', 'ID3'],
    value_vars=['R_u', 'L_u'],
    var_name='Side',
    value_name='u'
).assign(Side=lambda x: x['Side'].str.split('_').str[0])

# 处理sd列并提取Side
melt_sd = df.melt(
    id_vars=['ID', 'ID2', 'ID3'],
    value_vars=['R_sd', 'L_sd'],
    var_name='Side',
    value_name='sd'
).assign(Side=lambda x: x['Side'].str.split('_').str[0])

# 合并两个结果
df_result = melt_u.merge(melt_sd, on=['ID', 'ID2', 'ID3', 'Side'])

print(df_result)

该方案同样能得到目标结果,但当列数增多时,需要重复编写melt逻辑,效率不如pd.wide_to_long。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 15:50:25