让我们假设我有一个df,看起来像这样:
import pandas as pd
d = {'group': ['A', 'A', 'A', 'A', 'A', 'B', 'B', 'B', 'B', 'B', 'C', 'C', 'C', 'C', 'C'],
'number': [0, 3, 2, 1, 2, 1, -2, 1, 2, 3, 4, 2, 1, -1, 0]}
df = pd.DataFrame(data=d)
df
group number
0 A 0
1 A 3
2 A 2
3 A 1
4 A 2
5 B 1
6 B -2
7 B 1
8 B 2
9 B 3
10 C 4
11 C 2
12 C 1
13 C -1
14 C 0
如果number
列中有一个值是负的,我想删除整个组。我可以:
df.groupby('group').filter(lambda g: (g.number < 0).any())
然而,这给了我错误的输出,因为这返回所有组与任何number
列中有负数的行。见下文:group number
5 B 1
6 B -2
7 B 1
8 B 2
9 B 3
10 C 4
11 C 2
12 C 1
13 C -1
14 C 0
我如何改变这个函数,使它返回所有组而不返回任何number
列为负数。输出应为A组及其值。
使用布尔NOT运算符~
:
df.groupby('group').filter(lambda g: ~(g.number < 0).any())
或者使用De Morgan's Law检查all
值是否匹配:
df.groupby('group').filter(lambda g: (g.number >= 0).all())
您可以使用all函数返回与您期望的相反的结果。也就是说,它会起相反的作用。只有当全部为真时,它才会返回TRUE,否则它将返回FALSE。
Just Try:
not all(list)