Pandas中NaN是否干扰列拼接?如何处理含字符串与NaN的列拼接
解决两列含NaN/空字符串的拼接问题
嘿,我来帮你搞定这个拼接难题!咱们要实现的核心逻辑很明确:只要其中一列有有效内容(非NaN、非空字符串),就保留/拼接这些内容;只有当两列全是NaN或空字符串时,才返回NaN。下面给你两种简单好用的实现方式:
方法一:fillna+replace组合(最简洁高效)
先把NaN替换成空字符串,这样相加时不会被NaN干扰,之后再把空结果转回NaN,完美匹配你的需求:
import pandas as pd import numpy as np # 先模拟你的测试数据 df = pd.DataFrame({ 'col0': ['X', 'Y', 'Z', 'W'], 'col1': ['A', np.nan, np.nan, ''], 'col2': [np.nan, 'B', np.nan, 'B'] }) # 第一步:将NaN转为空字符串后相加,避免NaN打断拼接 df['col3'] = df['col1'].fillna('') + df['col2'].fillna('') # 第二步:把两列都为空的结果转回NaN df['col3'] = df['col3'].replace('', np.nan)
运行后就能得到你想要的结果:
| col0 | col1 | col2 | col3 |
|---|---|---|---|
| X | A | NaN | A |
| Y | NaN | B | B |
| Z | NaN | NaN | NaN |
| W | '' | B | B |
方法二:apply自定义逻辑(更灵活)
如果之后需要扩展拼接规则(比如加分隔符、过滤特定内容),可以用apply逐行处理,逻辑更直观:
df['col3'] = df[['col1', 'col2']].apply( lambda row: ''.join([val for val in row if pd.notna(val) and val != '']), axis=1 ) df['col3'] = df['col3'].replace('', np.nan)
这个方法会逐行检查每列的值,只保留非NaN且非空的内容再拼接,最后同样把空结果转成NaN,效果和方法一完全一致。
小补充
如果需要在两列都有内容时加分隔符(比如把A和B拼成"A|B"),只要把方法一里的空字符串改成你想要的分隔符就行,比如:
df['col3'] = df['col1'].fillna('') + '|' + df['col2'].fillna('')
之后再按同样的方法把空结果转回NaN即可。
内容的提问来源于stack exchange,提问作者Violatic
相关产品推荐
相关产品推荐

