在Python中合并DataFrame多列为字符串(类Excel TEXTJOIN)
Pandas实现类似TEXTJOIN的多列合并(排除空值)
需求说明
将DataFrame指定列的非空值(字符串类型)用分号;拼接为新列,空值(Na/NaN)不参与拼接;若所有列均为空,则新列值为NaN。示例效果如下:
a b c d RESULT 0 AA BB CC DD AA;BB;CC;DD 1 ab Na cd da ab;cd;da 2 Na xx Na Na xx 3 Na Na Na Na Na
解决方案
以下是两种高效实现方式,基于Pandas原生方法,无需额外依赖:
方法1:自定义函数+apply逐行处理
先定义一个过滤空值并拼接的函数,再应用到目标列上:
import pandas as pd import numpy as np # 构造示例数据 df = pd.DataFrame({ 'a': ['AA', 'ab', np.nan, np.nan], 'b': ['BB', np.nan, 'xx', np.nan], 'c': ['CC', 'cd', np.nan, np.nan], 'd': ['DD', 'da', np.nan, np.nan] }) def textjoin(row, sep=';'): # 筛选非空值并转为字符串 non_empty_vals = [str(val) for val in row if pd.notna(val)] # 有非空值则拼接,否则返回NaN return sep.join(non_empty_vals) if non_empty_vals else np.nan # 对指定列应用函数,生成RESULT列 df['RESULT'] = df[['a', 'b', 'c', 'd']].apply(textjoin, axis=1)
方法2:agg+lambda简洁写法
用agg结合filter实现一行式处理,再处理全空场景:
# 拼接非空值 df['RESULT'] = df[['a', 'b', 'c', 'd']].agg( lambda x: ';'.join(filter(pd.notna, x)), axis=1 ) # 将全空时生成的空字符串替换为NaN df['RESULT'] = df['RESULT'].replace('', np.nan)
结果验证
执行上述代码后,输出df即可得到符合要求的结果:
a b c d RESULT 0 AA BB CC DD AA;BB;CC;DD 1 ab NaN cd da ab;cd;da 2 NaN xx NaN NaN xx 3 NaN NaN NaN NaN NaN
为什么之前的方法无效?
- 直接用
+拼接:只要某列是NaN,拼接结果就会变成NaN,无法过滤空值; str.join:仅支持单个可迭代对象,不能直接传入多列Series;- 列表推导未过滤NaN:会把
NaN转为字符串"nan"加入结果; str.cat:默认行为是只要任一元素为NaN,整个拼接结果即为NaN,无法跳过空值。
内容的提问来源于stack exchange,提问作者Daniel Sezari
相关产品推荐
相关产品推荐

