Pandas存在空值时如何用指定分隔符合并多个字符串列
pandas多列拼接自动忽略空值的实现方案
直接用字符串加法拼接会把空字符串作为有效元素参与计算,必然产生多余分隔符,推荐以下两种可靠实现:
方法1:逐行过滤非空值后join(最易读,适合小数据集)
选中需要拼接的列,逐行筛掉值为空字符串的元素,再用/做分隔符直接join,Python原生的str.join会自动在非空元素之间添加分隔符,完全不会产生多余符号:
import pandas as pd df = pd.DataFrame({'id': [1,2,3], 'fea1':['high', 'med', ''], 'fea2': ['med', '', 'high'], 'fea3': ['low', 'high', 'low']}) df['fea'] = df[['fea1', 'fea2', 'fea3']].apply( lambda row: '/'.join(val for val in row if val), axis=1 )
运行后得到的结果完全匹配预期:
| id | fea1 | fea2 | fea3 | fea |
|---|---|---|---|---|
| 1 | high | med | low | high/med/low |
| 2 | med | high | med/high | |
| 3 | high | low | high/low |
- 优势:代码逻辑直白,不需要额外转换空值类型,写起来最快
- 劣势:apply是逐行循环运算,数据量超过10万行时运行速度偏慢
方法2:使用pandas原生str.cat拼接(性能最优,适合大数据集)
先把空字符串替换为pandas可识别的空值类型pd.NA,再调用内置的字符串拼接方法str.cat,设置na_rep=''参数就会自动跳过所有空值,全程是向量化运算,性能远高于apply:
merge_cols = ['fea1', 'fea2', 'fea3'] # 空字符串转pandas空值 df_temp = df[merge_cols].replace('', pd.NA) # 按分隔符合并,自动忽略空值 df['fea'] = df_temp[merge_cols[0]].str.cat(df_temp[merge_cols[1:]], sep='/', na_rep='')
- 优势:pandas底层C实现,百万行级数据也能秒级出结果
- 注意:如果你的空单元格本来就是
None/np.nan/pd.NA类型,不需要做replace替换,直接调用str.cat即可。
不推荐用正则替换多余
/的方案:比如拼接完再用正则替换连续/、去掉首尾/,这种写法容错率极低,如果后续业务逻辑调整出现多个连续空值、或者有效值本身带/,很容易出现替换错误。
内容的提问来源于stack exchange,提问作者zesla
相关产品推荐
相关产品推荐

