我有数据框:
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>
那么如何在每个组内进行行过滤?
答案 0 :(得分:6)
我认为groupby
不是必需的,只有在需要V
为0
的所有行时才使用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
但是如果需要返回所有至少有一列V
列0
等于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