Pandas多列含逗号分隔值与空值的拆分去重排序合并为单列Series
Pandas 行级跨列多值文本聚合处理方案
需求说明
在Pandas数据处理场景中,针对单元格为单值/, 分隔多值、含部分nan空值的DataFrame,需要逐行聚合处理所有列值,最终输出单列Series,处理规则为:
- 处理全程忽略所有
nan空值 - 对单元格内文本按
,规则拆分 - 汇总所有拆分后的取值,剔除重复项保留唯一值
- 剩余唯一值按字母表顺序排序
- 最终用
,拼接为整行输出字符串
示例参考
输入DataFrame构造
import pandas as pd import numpy as np df = pd.DataFrame({ 'c1' : ['a' , 'aa' , np.nan, np.nan, 'a, aa', 'abc' , 'acd' ], 'c2' : ['ab' , 'ab, abc', 'ab' , np.nan, np.nan , 'ab, a', 'ab, a'], 'c3' : ['abc', np.nan , 'a' , np.nan, 'abc' , np.nan, np.nan], 'c4' : ['abc', 'ab' , 'a' , np.nan, 'ab' , np.nan, np.nan] })
预期输出结果
调用自定义行处理方法得到的单列Series结果如下:
| 索引 | 结果值 |
|---|---|
| 0 | a, ab, abc |
| 1 | aa, ab, abc |
| 2 | a, ab |
| 3 | (空字符串) |
| 4 | a, aa, ab, abc |
| 5 | a, ab, abc |
| 6 | a, ab, acd |
注:原示例中第6行结果标注的abd为笔误,对应输入单元格取值为acd,实际输出应为acd
实现代码
可直接复用的处理逻辑如下,通过逐行应用函数完成全表处理:
def process_row(row): collected = [] # 遍历行内所有单元格 for cell_val in row: # 跳过空值 if pd.isna(cell_val): continue # 按分隔符拆分文本,加入收集列表 collected.extend(cell_val.split(', ')) # 去重后按字母序排序 sorted_unique = sorted(set(collected)) # 拼接为目标格式字符串 return ', '.join(sorted_unique) # 应用处理逻辑,得到最终结果Series result_series = df.apply(process_row, axis=1)
实现效果说明:全为空值的行,收集列表为空,会自动输出空字符串,完全匹配预期输出要求;去重、排序逻辑均满足需求规则,无额外副作用。
内容的提问来源于stack exchange,提问作者Francis Smart
相关产品推荐
相关产品推荐

