熊猫groupby和filter

伊巴本

我有数据框:

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:过滤器函数返回了一个Series,但预期为标量布尔

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

编辑: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等于0add any,因为过滤器需要过滤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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章