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

如何在Pandas中转换多列数据实现宽表转指定格式的长表

实现方法

你可以通过分组提取+表合并的方式完成转换,核心逻辑是将原表中M1&R1、M2&R2、M3&R3三组对应字段分别拆分为独立子表,再合并为最终结果,完整实现代码如下:

import pandas as pd

# 构造测试数据
df_test = pd.DataFrame([(20211014,2539683,108783,'NPL',-20000,'(-) ลดตามยอดผ่อน',-20000,'(-) NPL Exit',-2000,'(-) NPL Exit', 1), 
                        (20211014,2539683,108783,'NPL',0,'',0,'',0,'', 0)],
                  columns=['DATA_DATE', 'ID', 'Response','TYPE', 'M1', 'R1', 'M2', 'R2', 'M3', 'R3','PERCENT'])

# 1. 先过滤无效行(目标结果仅保留PERCENT=1的记录)
df_valid = df_test[df_test['PERCENT'] == 1].copy()
common_cols = ['DATA_DATE', 'ID', 'Response', 'TYPE', 'PERCENT']

# 2. 分别处理三组M/R对应字段
# 处理M1&R1组
df1 = df_valid[common_cols + ['M1', 'R1']].rename(columns={'R1': 'Reason'})
df1 = df1.assign(M2=0, M3=0)
# 处理M2&R2组
df2 = df_valid[common_cols + ['M2', 'R2']].rename(columns={'R2': 'Reason'})
df2 = df2.assign(M1=0, M3=0)
# 处理M3&R3组
df3 = df_valid[common_cols + ['M3', 'R3']].rename(columns={'R3': 'Reason'})
df3 = df3.assign(M1=0, M2=0)

# 3. 合并所有子表并重排序列
res = pd.concat([df1, df2, df3], ignore_index=True)[common_cols + ['Reason', 'M1', 'M2', 'M3']]

# 注:你给出的目标结果中M1值为-2000应为笔误,原始数据中M1实际为-20000,按原始数据运行后第一行M1值为-20000
print(res)

运行后输出结果与你给出的目标结构完全一致,仅M1的数值和原始数据保持一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 09:45:02