问题描述
我有 4 列数据 A、B、C、D。所有数据都在重复,例如第 1 行:P1 XX P1 LU 在第 11 行重复:P1 LU P1 XX。谁能帮我从 Pandas 数据框中删除重复单元?
输入:
A B C D
P1 XX P1 LU
P1 XX P9 LU
P1 XX P3 LU
P10 XX P10 LU
P2 XX P8 LU
P4 XX P1 LU
P6 XX P8 LU
P7 XX P10 LU
P9 XX P3 LU
P1 LU P4 XX
P1 LU P1 XX
P10 LU P7 XX
P10 LU P10 XX
P3 LU P1 XX
P3 LU P9 XX
P8 LU P2 XX
P8 LU P6 XX
P9 LU P1 XX
输出应该是这样的(反之亦然):
A B C D
P1 XX P1 LU
P1 XX P9 LU
P2 XX P8 LU
P7 XX P10 LU
P9 XX P3 LU
P1 LU P4 XX
P10 LU P7 XX
P3 LU P1 XX
P8 LU P6 XX
提前致谢
解决方法
听起来您的数据行可以任何顺序出现,您需要不考虑该顺序进行重复数据删除。
为了实现这一点,我们可以使用 pd.factorize
并将对象转换为数值变量,然后逐行应用求和。
在这里使用 apply
会很浪费,所以让我们稍微重塑一下您的数据框。
s = df.stack().to_frame(0)
df1 = df.assign(
ky=df.index.map(
s.assign(ky=s[0].factorize()[0]
).groupby(level=[0]).sum()['ky']))
print(df1)
A B C D ky
0 P1 XX P1 LU 3
1 P1 XX P9 LU 6
2 P1 XX P3 LU 7
3 P10 XX P10 LU 13
4 P2 XX P8 LU 16
5 P4 XX P1 LU 11
6 P6 XX P8 LU 19
7 P7 XX P10 LU 18
8 P9 XX P3 LU 10
9 P1 LU P4 XX 11
10 P1 LU P1 XX 3
11 P10 LU P7 XX 18
12 P10 LU P10 XX 13
13 P3 LU P1 XX 7
14 P3 LU P9 XX 10
15 P8 LU P2 XX 16
16 P8 LU P6 XX 19
17 P9 LU P1 XX 6
您现在可以根据您的 ky
列进行重复数据删除。
print(df1.drop_duplicates(subset=['ky'],keep='first'))
A B C D ky
0 P1 XX P1 LU 3
1 P1 XX P9 LU 6
2 P1 XX P3 LU 7
3 P10 XX P10 LU 13
4 P2 XX P8 LU 16
5 P4 XX P1 LU 11
6 P6 XX P8 LU 19
7 P7 XX P10 LU 18
8 P9 XX P3 LU 10
或检查重复项。
print(df1[df1.duplicated(subset='ky',keep=False)].sort_values('ky'))
A B C D ky
0 P1 XX P1 LU 3
10 P1 LU P1 XX 3
17 P9 LU P1 XX 6
1 P1 XX P9 LU 6
13 P3 LU P1 XX 7
2 P1 XX P3 LU 7
14 P3 LU P9 XX 10
8 P9 XX P3 LU 10
5 P4 XX P1 LU 11
9 P1 LU P4 XX 11
3 P10 XX P10 LU 13
12 P10 LU P10 XX 13
4 P2 XX P8 LU 16
15 P8 LU P2 XX 16
7 P7 XX P10 LU 18
11 P10 LU P7 XX 18
6 P6 XX P8 LU 19
16 P8 LU P6 XX 19
,
通常您会使用:
df_1.drop_duplicates()
这在这里不起作用,因为您认为重复的值在行中没有排序,因此您必须先对它们进行排序:
df_1[df_1.apply(sorted,axis=1).map(str).duplicated(keep='last')]
A B C D
0 P1 XX P1 LU
1 P1 XX P9 LU
2 P1 XX P3 LU
3 P10 XX P10 LU
4 P2 XX P8 LU
5 P4 XX P1 LU
6 P6 XX P8 LU
7 P7 XX P10 LU
8 P9 XX P3 LU
如果您只想要某些行进行重复检查:
df_1[df_1[['A','C']].apply(sorted,axis=1).map(str).duplicated()]
A B C D
9 P1 LU P4 XX
10 P1 LU P1 XX
11 P10 LU P7 XX
12 P10 LU P10 XX
13 P3 LU P1 XX
14 P3 LU P9 XX
15 P8 LU P2 XX
16 P8 LU P6 XX
17 P9 LU P1 XX