如果任何列值不在Pandas的列表中,则删除组
我有一个数据框,例如:
Groups VAL1 VAL2
G1 DOG 3
G1 DOG 3
G1 DOG 3
G1 CAT 3
G2 CAT 3
G2 CAT 3
G2 CAT 3
G3 DOG 3
G3 BIRD 3
G4 CAT 3
G5 DOG 48
G5 DOG 48
G6 DOG 3
G6 DOG 3
G7 CAT 34
G7 CAT 34
G8 DOG 78
G8 CAT 2
G9 DOG 30
G9 DOG 30
G9 DOG 30
G9 CAT 30
并且我想删除列表Groups中没有任何VAL1内容的所有内容 ( the_list=['BIRD','CAT']) 以及VAL2 > 20。
所以在这里我应该得到:
Groups VAL1 VAL2
G1 DOG 3
G1 DOG 3
G1 DOG 3
G1 CAT 3
G2 CAT 3
G2 CAT 3
G2 CAT 3
G3 DOG 3
G3 BIRD 3
G4 CAT 3
G6 DOG 3
G6 DOG 3
G7 CAT 34
G7 CAT 34
G8 DOG 78
G8 CAT 2
G9 DOG 30
G9 DOG 30
G9 DOG 30
G9 CAT 30
有人有使用熊猫的想法吗?
到目前为止,我尝试过:
tab.groupby('Groups').filter(lambda x: x['VAL2']>20 & x['VAL1'].isnotin(['BIRD','CAT']))
回答
如果我理解正确,组过滤器应该检查“VAL1列表中的任何一个或所有的VAL2都小于 20”:
the_list = ['BIRD', 'CAT']
df.groupby('Groups').filter(
lambda g: any(g.VAL1.isin(the_list)) | all(g.VAL2.lt(20)))
Groups VAL1 VAL2
0 G1 DOG 3
1 G1 DOG 3
2 G1 DOG 3
3 G1 CAT 3
4 G2 CAT 3
5 G2 CAT 3
6 G2 CAT 3
7 G3 DOG 3
8 G3 BIRD 3
9 G4 CAT 3
12 G6 DOG 3
13 G6 DOG 3
14 G7 CAT 34
15 G7 CAT 34
16 G8 DOG 78
17 G8 CAT 2
18 G9 DOG 30
19 G9 DOG 30
20 G9 DOG 30
21 G9 CAT 30
Groups VAL1 VAL2
0 G1 DOG 3
1 G1 DOG 3
2 G1 DOG 3
3 G1 CAT 3
4 G2 CAT 3
5 G2 CAT 3
6 G2 CAT 3
7 G3 DOG 3
8 G3 BIRD 3
9 G4 CAT 3
12 G6 DOG 3
13 G6 DOG 3
14 G7 CAT 34
15 G7 CAT 34
16 G8 DOG 78
17 G8 CAT 2
18 G9 DOG 30
19 G9 DOG 30
20 G9 DOG 30
21 G9 CAT 30
这些是当前答案的时间,有 220 万行。groupby 过滤器最易读,但在巨大的数据帧上稍微慢一些: