熊猫groupby和过滤器

时间:2017-01-07 15:52:40

标签: python pandas indexing group-by conditional-statements

我有数据框:

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

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

这似乎不起作用:

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

出现错误:

  

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

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

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

<ul class="main">
    <li class="main"><a href="cart.php" target="_blank"><img style ="margin-top:-5px;"  src="http://i63.tinypic.com/2u43au0.png" border="0" width="25" height="25"/></a></li>
    <li class="main"><a href="#about">About</a></li> 
    <li class="main"><a href="login.php">Login/Register</a></li>
</ul>

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

1 个答案:

答案 0 :(得分:6)

我认为groupby不是必需的,只有在需要V0的所有行时才使用boolean indexing

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

但是如果需要返回所有至少有一列V0等于any的群组,请添加True,因为filter需要False或{{ 1}}用于过滤组中的所有行:

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