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

在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 23:46:01