Pandas使用指定分隔符列拼接多列且避免空值产生多余分隔符
解决方案
核心逻辑是:先过滤掉每行待拼接列中的空值,再用当前行对应的分隔符拼接过滤后的非空内容,从根源上避免多余分隔符生成。
通用实现代码(适配多列动态调整场景)
你只需要修改concat_cols列表指定要拼接的列即可,不需要调整其他逻辑:
import pandas as pd df = pd.DataFrame({'col_1': ['', '1', '1', '2', '2', '3', '3', '4', '', '4', '5', '5', '5', '5', '5', '5'], 'col_2': ['A', '', 'C', 'A', '', 'C', 'D', 'D', 'A', 'A', 'B', 'E', 'F', 'G', 'H', 'I'], 'col_3': ['256', '546', '985', '573', '265', '731', '968', '592', '364', '', '953', '476', '835', '', '572', '903'], 'col_4': ['.', '.', '.', '-', '_', '_', '-', '.', '.', '/', '/', '.', '_', '_', '-', '.']}) # 在这里指定你需要拼接的列,业务列增减直接修改该列表即可 concat_cols = ['col_1', 'col_2', 'col_3'] df['concatenated'] = df.apply( lambda row: row['col_4'].join([val for val in row[concat_cols] if val]), axis=1 ) print(df)
运行效果
输出完全符合预期:
col_1 col_2 col_3 col_4 concatenated 0 A 256 . A.256 1 1 546 . 1.546 2 1 C 985 . 1.C.985 3 2 A 573 - 2-A-573 4 2 265 _ 2_265 5 3 C 731 _ 3_C_731 6 3 D 968 - 3-D-968 7 4 D 592 . 4.D.592 8 A 364 . A.364 9 4 A / 4/A 10 5 B 953 / 5/B/953 11 5 E 476 . 5.E.476 12 5 F 835 _ 5_F_835 13 5 G / 5/G 14 5 H 572 - 5-H-572 15 5 I 903 . 5.I.903
适配特殊空值场景
如果你的业务数据中空值不是空字符串'',而是pd.NA、NaN或者纯空格,只需修改列表推导式的判断条件即可:
- 空值为NaN/ pd.NA:
[val for val in row[concat_cols] if pd.notna(val)] - 需要过滤纯空格内容:
[val for val in row[concat_cols] if val.strip()]
大数据量优化
如果你的数据集超过100万行,apply性能不足,可以把待拼接列转为列表、分隔符转为列表,用原生Python循环处理,速度会比DataFrame apply快3~5倍。
内容的提问来源于stack exchange,提问作者prem
相关产品推荐
相关产品推荐

