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

如何在DataFrame中仅当两列均有值时用分隔符拼接?

Pandas 拼接两列:仅当都有有效值时保留分隔符

嘿,我刚好碰到过类似的需求,给你几个实用的解决方案,都能完美实现你想要的效果:

首先先把示例DataFrame构造出来,方便你复现测试:

import pandas as pd
import numpy as np

df = pd.DataFrame({
    'col1': ['a', np.nan, 'a'],
    'col2': ['b', 'b', np.nan]
})

方法1:灵活通用的逐行处理(支持多列扩展)

用apply结合lambda函数,逐行过滤非空值后再拼接,这个方法最灵活,哪怕以后要加第三列、第四列也能直接修改:

df['combined'] = df.apply(
    lambda row: '-'.join([val for val in row if pd.notna(val)]),
    axis=1
)

原理很简单:遍历每一行,把不为NaN的元素收集起来,用'-'连接。如果只有一个非空值,就直接输出该值;两个都有就带分隔符;全空的话会得到空字符串。

方法2:高效的条件判断(适合大数据集)

如果你的DataFrame行数很多,apply逐行处理可能效率偏低,这时候用numpy.where做向量化判断会快很多:

df['combined'] = np.where(
    # 当col1和col2都不为空时
    pd.notna(df['col1']) & pd.notna(df['col2']),
    # 拼接带分隔符
    df['col1'] + '-' + df['col2'],
    # 否则直接拼接非空值(等价于取存在的那个)
    df['col1'].fillna('') + df['col2'].fillna('')
)

方法3:简洁的字符串拼接法

用Pandas的str.cat方法快速拼接,再用正则去掉首尾多余的分隔符:

# 先拼接,空值用空字符串代替
temp = df['col1'].str.cat(df['col2'], sep='-', na_rep='')
# 去掉开头或结尾的分隔符
df['combined'] = temp.str.replace('^-|-$', '', regex=True)

最终结果

不管用哪种方法,你都会得到期望的输出:

col1 col2 combined
0    a    b      a-b
1  NaN    b        b
2    a  NaN        a

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 04:45:54