python-3.x – 如何通过python删除pandas数据帧中第二个连续/出现的重复行?

我的数据框如下所示

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

现在我想基于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)

我把输出作为

     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

在上面的输出中,它删除了第5行,第6行和第10行,第11行,第12行的pid列的第二个连续值(1和7).但它也删除了uid = 2和uid = 3.我想在第13,14,15行保持uid = 2的pid(6,7)值.同样对于uid = 3和sid = 4,我想将pid(1,5)值保持在第17行,第18行.然后对于uid = 3和sid = 5,我想将pid(1,2)值保持在第20,21,22,23行.现在我想删除pid(1)的重复值,uid = 1,sid = 1,第5,第6行,然后pid(7),uid = 1,sid = 2,第10,11,12行,然后是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

怎么做到这一点?指导我获得上述输出.提前致谢.

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

最佳答案 你快到了.这可以使用groupby函数实现,并且只保留前2行.

码:

df.groupby(['pid', 'sid']).head(2)

输出:

    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
点赞