pandas如何将多列合并为单列并逐行去重、移除nan值
pandas多列合并为单列逐行去重、去空值解决方案
你现有代码存在3个可优化点:
- 列名大小写不匹配,DataFrame定义的列名为大写
A/B/C,选取时用了小写a/b/c - 示例数据中的
'nan'是字符串格式,pandas无法识别为空值,需要先做转换 - 直接使用
agg(', '.join)没有加入空值过滤、逐行去重的逻辑
完整可运行代码
import pandas as pd import numpy as np # 初始化原始数据 df = pd.DataFrame(np.array([['nan', 'nan', 'nan'], ['nan', 1, 1], ['nan', 'x', 2]]), columns=['A', 'B', 'C']) # 将字符串格式的nan转为pandas可识别的空值 df = df.replace('nan', np.nan) # 定义行处理逻辑:过滤空值→按出现顺序去重→拼接为字符串 def merge_single_row(row): # 用dict.fromkeys实现有序去重,兼容Python3.7及以上版本 valid_unique_vals = list(dict.fromkeys([val for val in row if pd.notna(val)])) return ','.join(map(str, valid_unique_vals)) # 应用到目标列生成结果 df['New_col'] = df[['A', 'B', 'C']].apply(merge_single_row, axis=1) # 可选:删除原有的A/B/C列,仅保留结果列 # df = df.drop(columns=['A', 'B', 'C'])
输出结果验证
| Index | A | B | C | New_col |
|---|---|---|---|---|
| 0 | NaN | NaN | NaN | |
| 1 | NaN | 1 | 1 | 1 |
| 2 | NaN | x | 2 | x,2 |
内容的提问来源于stack exchange,提问作者Shawn Jamal
相关产品推荐
相关产品推荐

