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 值的第二次出现。
你快到了。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)
归档时间: |
|
查看次数: |
1031 次 |
最近记录: |