Pandas中每行两列值去重排序并忽略NaN的实现求助
解决方案
可以通过apply逐行处理DataFrame,结合过滤缺失值、去重、排序和字符串拼接来实现需求:
import pandas as pd # 示例数据 data = {'A': ['1','2','8','4',pd.NA], 'B': ['6','2','3','9','10']} df = pd.DataFrame(data) # 定义处理函数 def get_sorted_unique(row): # 提取当前行的A、B值,过滤缺失值 valid_vals = [val for val in [row['A'], row['B']] if pd.notna(val)] # 去重后排序,再拼接为逗号分隔的字符串 return ', '.join(sorted(set(valid_vals))) # 生成目标列 df['expected_col'] = df.apply(get_sorted_unique, axis=1) print(df)
运行后输出:
A B expected_col 0 1 6 1, 6 1 2 2 2 2 8 3 3, 8 3 4 9 4, 9 4 NaN 10 10
关键步骤说明
- 过滤缺失值:用列表推导式筛选出
A和B中不为NaN的值 - 去重:通过
set()对有效值去重(每行仅两个值,去重效率极高) - 排序:
sorted()默认按字符串字典序排序,若需按数值排序,可修改为:sorted(set(valid_vals), key=int) - 字符串拼接:用
', '.join()将排序后的列表转为指定格式的字符串
如果追求简洁,也可以用lambda表达式一行实现:
df['expected_col'] = df.apply( lambda r: ', '.join(sorted(set([v for v in [r['A'], r['B']] if pd.notna(v)]))), axis=1 )
内容的提问来源于stack exchange,提问作者Andre Nevares
相关产品推荐
相关产品推荐

