我的数据框如下所示
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