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

如何用Pandas将DataFrame的B/C系列对应列融合为B、C两列?

Pandas DataFrame多列配对重塑解决方案

针对你的需求,这里提供两种高效的解决方法:

方法一:分别处理B/C列后合并

先单独将B类、C类列转为长格式,提取列名中的序号作为匹配键,最后合并两表得到结果:

import pandas as pd

# 示例原始数据
data = {
    'ID_col': ['ID_1', 'ID_2'],
    'B1': ['B1_value', 'B2_value'],
    'B2': ['B1_value2', 'B2_value2'],
    'B3': ['B1_value3', 'B2_value3'],
    'C1': ['C1_value', 'C2_value'],
    'C2': ['C1_value2', 'C2_value2'],
    'C3': ['C1_value3', 'C2_value3']
}
df = pd.DataFrame(data)

# 处理B列,提取序号用于匹配
b_melted = df.melt(id_vars=['ID_col'], value_vars=['B1','B2','B3'], value_name='B')
b_melted['seq'] = b_melted['variable'].str.extract('(\d+)')

# 处理C列,同样提取序号
c_melted = df.melt(id_vars=['ID_col'], value_vars=['C1','C2','C3'], value_name='C')
c_melted['seq'] = c_melted['variable'].str.extract('(\d+)')

# 按ID和序号合并,保留需要的列
final_df = pd.merge(b_melted, c_melted, on=['ID_col','seq'])[['ID_col','B','C']]

方法二:使用wide_to_long直接转换

Pandas的wide_to_long专门处理这种"前缀+序号"的宽表转长表场景,代码更简洁:

# 直接转换,stubnames指定前缀B和C,j提取序号
df_long = pd.wide_to_long(df, stubnames=['B','C'], i='ID_col', j='seq', sep='', suffix='\d+')

# 重置索引得到目标结构
final_df = df_long.reset_index()[['ID_col','B','C']]

参数说明:

  • stubnames:指定宽表中需要转换的列前缀(这里是B和C)
  • i:作为标识符的列(这里是ID_col)
  • j:提取的序号列名
  • sep:列名中前缀和序号的分隔符(这里为空,因为列名是B1、C1这种无分隔符的形式)
  • suffix:匹配序号的正则表达式,\d+表示匹配一个或多个数字

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 03:01:01