首页 > 解决方案 > 基于多列删除重复项

问题描述

我想创建一个子集,其中删除了具有 3 个或更多相同列的数据,但保留了原始数据。我有 4 列 ['col1', 'col2', 'col3', 'col4'],并编写了下一个代码:

df1 = data_between_all.drop_duplicates(['col1', 'col2', 'col3']).copy()
df2 = data_between_all.drop_duplicates(['col1', 'col3', 'col4']).copy()
df3 = data_between_all.drop_duplicates(['col1', 'col2', 'col4']).copy()
df4 = data_between_all.drop_duplicates(['col2', 'col3', 'col4']).copy()

data_without_duplicates = df1.append([df2, df3, df4]).drop_duplicates()

有没有最复杂的方法来做到这一点?

标签: pythonpandasdataframefiltering

解决方案


您可以使用一个简单的循环在每次迭代中排除一列:

设置一个最小的可重现示例

df = pd.DataFrame(np.random.randint(0, 2, (10, 4)),
                  columns=['col1', 'col2', 'col3', 'col4'])
print(df)

样本数据:

>>> df
   col1  col2  col3  col4
0     1     1     1     1
1     1     1     1     1
2     0     0     0     1
3     0     1     1     0
4     1     0     0     0
5     1     1     0     1
6     0     0     1     0
7     0     1     0     0
8     0     0     0     0
9     1     0     1     0
data = []
for col in df.columns:
    data.append(df.drop_duplicates(df.columns[df.columns != col]))
out = pd.concat(data).drop_duplicates()

输出结果:

>>> out
   col1  col2  col3  col4
0     1     1     1     1
2     0     0     0     1
3     0     1     1     0
4     1     0     0     0
5     1     1     0     1
6     0     0     1     0
7     0     1     0     0
9     1     0     1     0

推荐阅读