gpt4 book ai didi

python - Pandas 分组和过滤器

转载 作者:太空狗 更新时间:2023-10-29 20:58:01 25 4
gpt4 key购买 nike

我有数据框:

df = pd.DataFrame({'ID':[1,1,2,2,3,3], 
'YEAR' : [2011,2012,2012,2013,2013,2014],
'V': [0,1,1,0,1,0],
'C':[00,11,22,33,44,55]})

我想按 ID 分组,并在每个组中选择 V = 0 的行。

这似乎不起作用:

print(df.groupby(['ID']).filter(lambda x: x['V'] == 0)) 

出现错误:

TypeError: filter function returned a Series, but expected a scalar bool

如何使用过滤器来实现目标?谢谢。

编辑:每个组的 V 条件可能不同,例如,ID 1 可能是 V==0,ID 2 可能是 V==1,并且可以通过另一个 DF 获得此信息:

df = pd.DataFrame({'ID':[1,2,3], 
'V': [0,1,0])

那么如何在每个组内进行行过滤呢?

最佳答案

我觉得groupby没必要,用boolean indexing仅当需要 V0 的所有行时:

print (df[df.V == 0])
C ID V YEAR
0 0 1 0 2011
3 33 2 0 2013
5 55 3 0 2014

但如果需要返回所有组,其中 V 列的至少一个值等于 0 添加 any,因为 filter需要 TrueFalse 来过滤组中的所有行:

print(df.groupby(['ID']).filter(lambda x: (x['V'] == 0).any())) 
C ID V YEAR
0 0 1 0 2011
1 11 1 1 2012
2 22 2 1 2012
3 33 2 0 2013
4 44 3 1 2013
5 55 3 0 2014

更好的测试方法是更改​​ groupby 的列 - 2012 的行被过滤掉,因为没有 V==0:

print(df.groupby(['YEAR']).filter(lambda x: (x['V'] == 0).any())) 
C ID V YEAR
0 0 1 0 2011
3 33 2 0 2013
4 44 3 1 2013
5 55 3 0 2014

如果性能很重要,请使用 GroupBy.transformboolean indexing :

print(df[(df['V'] == 0).groupby(df['YEAR']).transform('any')]) 
ID YEAR V C
0 1 2011 0 0
3 2 2013 0 33
4 3 2013 1 44
5 3 2014 0 55

详细信息:

print((df['V'] == 0).groupby(df['YEAR']).transform('any')) 
0 True
1 False
2 False
3 True
4 True
5 True
Name: V, dtype: bool

关于python - Pandas 分组和过滤器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41523270/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com