熊猫groupby和过滤器

iwb*_*abn 8 python indexing group-by conditional-statements pandas

我有数据帧:

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]})
Run Code Online (Sandbox Code Playgroud)

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

这似乎不起作用:

print(df.groupby(['ID']).filter(lambda x: x['V'] == 0)) 
Run Code Online (Sandbox Code Playgroud)

出了错误:

TypeError:filter函数返回一个Series,但是期望一个标量bool

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

编辑:V上的条件可能因组而异,例如,对于ID 1,V == 0,对于ID 2,V == 1,此信息可通过另一个DF获得:

df = pd.DataFrame({'ID':[1,2,3], 
                   'V': [0,1,0])
Run Code Online (Sandbox Code Playgroud)

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

jez*_*ael 9

我认为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
Run Code Online (Sandbox Code Playgroud)

但是如果需要返回所有至少有一个列值V等于0add的组any,因为filter需要True或者False用于过滤组中的所有行:

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
Run Code Online (Sandbox Code Playgroud)

更好的测试是更改列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
Run Code Online (Sandbox Code Playgroud)