如何在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的方法存在两个明显问题:
- 效率低下:
iterrows是逐行遍历逻辑,数据量较大时性能会急剧下降; - 逻辑错误:每次循环都对整个
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:向量化处理(性能最优)
针对大数据量场景,推荐使用向量化操作避免逐行遍历,性能提升显著:
- 将
merge列拆分为两个临时列,存储需要拼接的两个列名; - 用
df.lookup快速提取每行对应列的值; - 拼接提取到的内容。
# 拆分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
相关产品推荐
相关产品推荐

