删除重复的行而不考虑项目顺序熊猫

时间:2021-07-25 08:54:05

标签: python pandas duplicates remove drop-duplicates

我有 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

提前致谢

2 个答案:

答案 0 :(得分:2)

听起来您的数据行可以任何顺序出现,您需要不考虑该顺序进行重复数据删除。

为了实现这一点,我们可以使用 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

答案 1 :(得分:1)

通常您会使用:

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
相关问题