如何去除DataFrame单行内的重复值?
解决DataFrame行内重复值去重问题
我完全懂你的需求——你要移除每行内部的重复值,只保留唯一值,而df.drop_duplicates()是用来处理整行重复的(也就是跨行的重复行),确实和你的场景不匹配。下面给你几个简单高效的实现方法:
1. 先构造示例数据
先还原你的测试数据,方便验证效果:
import pandas as pd data = { 'Column 1': ['A', 'D', 'E', 'F'], 'Column 2': ['B', 'C', 'E', 'G'], 'Column 3': ['A', 'C', 'E', 'H'] } df = pd.DataFrame(data) print("原始数据:") print(df)
输出和你的示例一致:
Column 1 Column 2 Column 3 0 A B A 1 D C C 2 E E E 3 F G H
2. 核心去重方法
方法一:用apply + unique()
对每行执行去重操作,自动用NaN填充空缺位置,最后还原原列名:
# 按行处理,提取唯一值并转为Series df_cleaned = df.apply(lambda row: pd.Series(row.unique()), axis=1) # 对齐原列名 df_cleaned.columns = df.columns # 如果需要把NaN替换为空字符串(和你的示例格式完全匹配) df_cleaned = df_cleaned.fillna('') print("\n处理后的数据:") print(df_cleaned)
输出就是你想要的结果:
Column 1 Column 2 Column 3 0 A B 1 D C 2 E 3 F G H
方法二:用apply + dict.fromkeys()
如果你需要严格保证值的出现顺序(unique()在大部分场景下也会保留顺序,但dict.fromkeys()是更稳妥的方式),可以利用字典键的唯一性来去重:
df_cleaned = df.apply(lambda row: pd.Series(list(dict.fromkeys(row))), axis=1) df_cleaned.columns = df.columns df_cleaned = df_cleaned.fillna('')
这个方法的效果和方法一完全一致,只是去重的底层逻辑不同,适合对顺序有严格要求的场景。
简单原理说明
axis=1参数指定按行处理,而不是默认的按列row.unique()/dict.fromkeys(row)会提取该行的唯一值,保留首次出现的顺序- 转成
pd.Series后,长度不足的位置会自动填充NaN,最后通过fillna('')转为空字符串,完美匹配你的示例格式
内容的提问来源于stack exchange,提问作者user3468356
相关产品推荐
相关产品推荐

