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

Python pandas如何处理dataframe 实现宽表转指定合并长表

实现方法

你需要的是将符合[PRE/POST]_[SPC数字]命名规则的宽表列转换为指定结构的长表,直接用pandas的melt方法即可完成,完整实现代码如下:

import pandas as pd

# 原数据
df = pd.DataFrame({'CPDID': {0: 'C1', 1: 'C2', 2: 'C3'},
                   'Rate': {0: 100, 1: 500, 2: 200},
                   'PRE_SPC1': {0: 'NaN', 1: 'NaN', 2: 'NaN'},
                   'POST_SPC2': {0:10, 1:50, 2:80},
                   'POST_SPC3': {0:30, 1:40, 2:10}})

# 1. 宽表转长表,保留CPDID、Rate作为固定列
melt_df = df.melt(id_vars=['CPDID', 'Rate'], 
                  var_name='col_name', 
                  value_name='Damage')

# 2. 拆分列名提取PRE和SPC信息
melt_df[['pre_tag', 'spc_tag']] = melt_df['col_name'].str.split('_', expand=True)
# 映射PRE值:PRE为1,POST为0
melt_df['PRE'] = melt_df['pre_tag'].map({'PRE': 1, 'POST': 0})
# 提取SPC数字
melt_df['SPC'] = melt_df['spc_tag'].str.replace('SPC', '').astype(int)

# 3. 筛选需要的列,调整顺序
final_df = melt_df[['CPDID', 'Rate', 'PRE', 'SPC', 'Damage']].reset_index(drop=True)

# 输出结果
print(final_df)

结果说明

注意:你示例中给出的df2第三行CPDID为C2属于笔误,实际对应原数据第三行CPDID为C3,代码处理会自动匹配原数据的正确值
上述代码输出的final_df和你要求的pd.concat([df1, df2, df3])结果完全一致(示例中你只给出了SPC1对应的df1和SPC2对应的df2,代码会自动包含SPC3对应的数据行)。
如果需要单独提取某个SPC或者PRE分组的子表,直接按列筛选即可:

  • 提取PRE=1的所有数据:df_pre = final_df[final_df['PRE'] == 1]
  • 提取SPC=2的所有数据:df_spc2 = final_df[final_df['SPC'] == 2]

内容的提问来源于stack exchange,提问作者Expectation mean first moment

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 23:45:00