如何使用python从pandas数据框中删除第二个连续/出现的重复行?

use*_*109 5 python-3.x pandas pandas-groupby

我的数据框如下所示

import pandas as pd
uid=[1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,2,3,3,3,3,3,3,3,3]
pid=[1,1,1,2,2,1,1,7,7,8,7,7,7,6,6,7,6,1,5,1,1,2,2,2,1]
sid=[1,1,1,1,1,1,1,2,2,2,2,2,2,3,3,3,3,4,4,4,5,5,5,5,5]
df=pd.DataFrame({'uid':uid, 'pid':pid,'sid':sid})

print(df)


     uid  pid  sid
0     1    1    1
1     1    1    1
2     1    1    1
3     1    2    1
4     1    2    1
5     1    1    1
6     1    1    1
7     1    7    2
8     1    7    2
9     1    8    2
10    1    7    2
11    1    7    2
12    1    7    2
13    2    6    3
14    2    6    3
15    2    7    3
16    2    6    3
17    3    1    4
18    3    5    4
19    3    1    4
20    3    1    5
21    3    2    5
22    3    2    5
23    3    2    5
24    3    1    5
Run Code Online (Sandbox Code Playgroud)

现在我想根据 uid 和 sid 删除第 5、6 行和第 10、11、12 行的 pid 列的第二个连续/出现值(1 和 7)。我使用以下代码作为

df['start'] = df['pid'] != df['pid'].shift()
df['start'] = df['pid'] != df['pid'].shift()
df['group'] = df.groupby('pid')['start'].cumsum()
result = df.loc[df['group'] == 1]
print(result)
Run Code Online (Sandbox Code Playgroud)

我得到的输出为

     uid  pid  sid  start  group
0     1    1    1   True    1.0
1     1    1    1  False    1.0
2     1    1    1  False    1.0
3     1    2    1   True    1.0
4     1    2    1  False    1.0
7     1    7    2   True    1.0
8     1    7    2  False    1.0
9     1    8    2   True    1.0
13    2    6    3   True    1.0
14    2    6    3  False    1.0
18    3    5    4   True    1.0
Run Code Online (Sandbox Code Playgroud)

在上面的输出中,它删除了第 5、6 行和第 10、11、12 行的 pid 列的第二个连续值(1 和 7)。但它也会删除 uid=2 和 uid=3。我想将 uid=2 的 pid(6,7) 值保留在第 13、14、15 行。同样对于 uid=3 和 sid=4 我想将 pid(1,5) 值保留在第 17,18 行。然后对于 uid=3 和 sid=5 我想将 pid(1,2) 值保持在第 20、21、22、23 行。现在我想在第 5、6 行删除 uid=1 和 sid=1 的 pid(1) 的重复值,然后在第 10、11、12 行删除 uid=1,sid=2 的 pid(7) 重复值,然后是 pid (6) uid=2,sid=3 在第 16 行,然后 pid(1) 表示 uid=3,sid=4 在第 19 行,然后 pid(1) 表示 uid=3,sid=5 在第 24 行,如下所示

     uid  pid  sid
0     1    1    1
1     1    1    1
2     1    1    1
3     1    2    1
4     1    2    1
7     1    7    2
8     1    7    2
9     1    8    2
13    2    6    3
14    2    6    3
15    2    7    3
17    3    1    4
18    3    5    4
20    3    1    5
21    3    2    5
22    3    2    5
23    3    2    5
Run Code Online (Sandbox Code Playgroud)

如何实现这一目标?指导我得到上面的输出。提前致谢。

注意:第二个连续值并不总是连续的,有时它可能是单一的,只不过是 pid 值的第二次出现。

Nav*_*een 2

你快到了。groupby这可以使用函数并仅保留前两行来实现。

代码:

df.groupby(['pid', 'sid']).head(2)
Run Code Online (Sandbox Code Playgroud)

输出:

    uid pid sid
0   1   1   1
1   1   1   1
2   1   2   1
3   1   2   1
6   1   7   2
7   1   7   2
8   1   8   2
9   1   8   2
12  2   7   3
13  2   7   3
16  3   1   4
17  3   1   4
Run Code Online (Sandbox Code Playgroud)