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

如何基于两个ID字段对含多组列的Pandas DataFrame进行逆透视

解决方案

你可以通过Pandas的两种常用方法实现这种逆透视转换,以下是具体实现:

方法一:使用pd.wide_to_long(推荐,适配有规律的列名)

这种方法专门针对你的列名格式(带有First/Second前缀,后跟ReasonName/ReasonValue),代码简洁高效:

步骤1:构造示例数据

import pandas as pd

df = pd.DataFrame({
    'pid': [1, 2],
    'fid': ["'x'", "'y'"],
    'FirstReasonName': ["'a'", "'c'"],
    'FirstReasonValue': [3, 8],
    'SecondReasonName': ["'b'", "'d'"],
    'SecondReasonValue': [8.2, 7]
})

步骤2:执行逆透视

# 调用wide_to_long处理宽表
result = pd.wide_to_long(
    df,
    stubnames=['ReasonName', 'ReasonValue'],  # 列名的公共后缀部分
    i=['pid', 'fid'],  # 作为标识的主键列
    j='ReasonNum',     # 生成的区分不同组的临时列
    sep='',            # 列名前缀和后缀之间无分隔符
    suffix='.*'        # 匹配前缀部分(First/Second)
).reset_index()

# 重命名列并筛选需要的字段
result = result.rename(columns={'ReasonName': 'Reason', 'ReasonValue': 'Value'})[['pid', 'fid', 'Reason', 'Value']]

方法二:使用melt(通用型逆透视方法)

如果列名规律不明显,可通过分两次逆透视再合并的方式实现:

# 逆透视ReasonName列
reason_df = df.melt(
    id_vars=['pid', 'fid'],
    value_vars=['FirstReasonName', 'SecondReasonName'],
    value_name='Reason'
).drop(columns='variable')

# 逆透视ReasonValue列
value_df = df.melt(
    id_vars=['pid', 'fid'],
    value_vars=['FirstReasonValue', 'SecondReasonValue'],
    value_name='Value'
).drop(columns='variable')

# 合并两个结果
result = pd.concat([reason_df, value_df['Value']], axis=1)

最终结果

两种方法都会得到你需要的格式:

pidfidReasonValue
1'x''a'3.0
1'x''b'8.2
2'y''c'8.0
2'y''d'7.0

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 07:12:15