Ral*_*ler 3 python dataframe pandas
我确实有以下数据框
df1 = pd.DataFrame({'case':[1,1,1,1,1,1,2,2,2,2,6,6,6,6,6,3,3,3,3,3,3],
'action':['A','B','C','B','D','A','B','B','D','A','B','B','D','A','F','A','B','C','B','D','A']})
case action
0 1 A
1 1 B
2 1 C
3 1 B
4 1 D
5 1 A
6 2 B
7 2 B
8 2 D
9 2 A
10 6 B
11 6 B
12 6 D
13 6 A
14 6 F
15 3 A
16 3 B
17 3 C
18 3 B
19 3 D
20 3 A
Run Code Online (Sandbox Code Playgroud)
如果在case
-group 中,倒数第二个action
值是 a D
,而a的最后一个action
值是 an,A
则必须删除最后一行。结果应该是:
df2 = pd.DataFrame({'case':[1,1,1,1,1,2,2,2,6,6,6,6,6,3,3,3,3,3],
'action':['A','B','C','B','D','B','B','D','B','B','D','A','F','A','B','C','B','D']})
case action
0 1 A
1 1 B
2 1 C
3 1 B
4 1 D
5 2 B
6 2 B
7 2 D
8 6 B
9 6 B
10 6 D
11 6 A
12 6 F
13 3 A
14 3 B
15 3 C
16 3 B
17 3 D
Run Code Online (Sandbox Code Playgroud)
几乎什么都试过了。感谢任何帮助。
groupby
,tail
和shift
t = df1.groupby('case').tail(2)
m = t['action'].eq('A') & t.groupby('case')['action'].shift().eq('D')
df1.drop(m[m].index)
Run Code Online (Sandbox Code Playgroud)
Group
数据帧df1
由case
和选择最后2
使用从每一组行tail(2)
>>> t
case action
4 1 D
5 1 A
8 2 D
9 2 A
13 6 A
14 6 F
19 3 D
20 3 A
Run Code Online (Sandbox Code Playgroud)
现在,group
数据帧t
由case
和shift
列action
向下一个单元
>>> t.groupby('case')['action'].shift()
4 NaN
5 D
8 NaN
9 D
13 NaN
14 A
19 NaN
20 D
Name: action, dtype: object
Run Code Online (Sandbox Code Playgroud)
通过分别比较action
列A
和移位action
列来创建布尔掩码D
,然后取两个掩码的逻辑和
>>> m
4 False
5 True
8 False
9 True
13 False
14 False
19 False
20 True
Name: action, dtype: bool
Run Code Online (Sandbox Code Playgroud)
Drop
与df1
掩码m
中的索引对应的数据帧中的行具有True
值
>>> df1.drop(m[m].index)
case action
0 1 A
1 1 B
2 1 C
3 1 B
4 1 D
6 2 B
7 2 B
8 2 D
10 6 B
11 6 B
12 6 D
13 6 A
14 6 F
15 3 A
16 3 B
17 3 C
18 3 B
19 3 D
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
66 次 |
最近记录: |