如何在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
相关产品推荐
相关产品推荐

