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

如何在Pandas中基于分隔字符串动态拼接多列?

高效实现Pandas中按动态列名拼接多列

问题描述

给定如下DataFrame,其中merge列存储了需要拼接的列名(以!分隔),需根据每行的merge值动态拼接对应列的内容,生成new_col:

import pandas as pd

df = pd.DataFrame({
    'prodName': ['p1', 'p2', 'p3'],
    'mfr': ['m1', 'm2', 'm3'],
    'segment': ['s1','s2','s3'],
    'brand': ['b1','b2','b3'],
    'merge': ['mfr!segment','mfr!brand','segment!brand']
})

当前DataFrame:

prodName mfr segment brand         merge
0       p1  m1      s1    b1  mfr!segment
1       p2  m2      s2    b2    mfr!brand
2       p3  m3      s3    b3  segment!brand

期望输出:

prodName mfr segment brand         merge new_col
0       p1  m1      s1    b1  mfr!segment   m1_s1
1       p2  m2      s2    b2    mfr!brand   m2_b2
2       p3  m3      s3    b3  segment!brand   s3_b3

原方法的问题

你当前使用iterrows的方法存在两个明显问题:

  1. 效率低下:iterrows是逐行遍历逻辑,数据量较大时性能会急剧下降;
  2. 逻辑错误:每次循环都对整个new_col列赋值,最终只会保留最后一次循环的拼接结果,无法得到每行对应的正确值。

高效解决方案

方法1:apply逐行处理(简洁易读)

通过apply结合lambda函数,针对每行拆分merge列的列名,提取对应列的值后拼接:

df['new_col'] = df.apply(
    lambda row: '_'.join([row[col] for col in row['merge'].split('!')]),
    axis=1
)

方法2:向量化处理(性能最优)

针对大数据量场景,推荐使用向量化操作避免逐行遍历,性能提升显著:

  1. 将merge列拆分为两个临时列,存储需要拼接的两个列名;
  2. 用df.lookup快速提取每行对应列的值;
  3. 拼接提取到的内容。
# 拆分merge列为两个列名列
df[['col1', 'col2']] = df['merge'].str.split('!', expand=True)

# 提取对应值并拼接
df['new_col'] = df.lookup(df.index, df['col1']) + '_' + df.lookup(df.index, df['col2'])

# 可选:删除临时生成的col1和col2列
df = df.drop(['col1', 'col2'], axis=1)

两种方法均可得到符合要求的结果,其中方法2的向量化操作在数据量较大时优势明显。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 17:53:08