在 Pandas 中过滤 GroupBy 之后的组,同时保留组

Péť*_*iak 12 python pandas pandas-groupby

在熊猫中,我想做: df.groupby('A').filter(lambda x: x.name > 0)- 按列A分组,然后过滤名称值为非正值的组。然而,这会取消分组作为GroupBy.filter返回DataFrame并因此丢失分组。我想按此顺序执行此操作,因为它的计算量要求较低,因为filter其次groupby会遍历 DataFrame 两次(先过滤然后分组)?此外,从分组中克隆组(到 dict 或其他内容)会使我失去无缝返回数据框的功能(就像在示例中.filter直接获取DataFrame

谢谢

例子:

   A  B
1 -1  1
2 -1  2
3  0  2
4  1  1
5  1  2
Run Code Online (Sandbox Code Playgroud)

df.groupby('A')

GroupBy object
-1 : [1, 2]
 0 : [3]
 1 : [4,5]
Run Code Online (Sandbox Code Playgroud)

GroupBy.filter(lambda x: x.name >= 0)

GroupBy object
 0 : [3]
 1 : [4,5]
Run Code Online (Sandbox Code Playgroud)

pet*_*sol 5

我认为以前的答案提出了解决方法,这可能对您的情况有用,但没有回答问题。

您创建了组,并且希望根据组统计数据删除或保留一些组,然后对这些组执行一些您真正关心的组统计。这应该是可能的,并且在许多情况下很有用,但是,只有当您因此使用两个相同的 groupby 时,才不可能将其作为链接命令(据我所知)。

让我们举个例子:Groupby 揭示了一些在项目级别基础上不可过滤的特征(所以以前的过滤不是一个选项)。例如一组总和。过滤器中的烦恼是,它返回一个数据帧而不是保留分组并允许您对组执行进一步的计算。

下面是一个例子:

假设您想按 'C' 分组并过滤组中 'A' 的总和(<700),但在过滤的组中,您实际上关心组的标准。如果过滤器只是组的过滤器,这将起作用:

df.groupby(['C']).filter(lambda x:x['A'].sum()<700, combine=False).std()
Run Code Online (Sandbox Code Playgroud)

这不起作用(注意combine=False过滤器上不存在的选项),这是什么:

df.groupby(['C']).filter(lambda x:x['A'].sum()<700).groupby(['C']).std()
Run Code Online (Sandbox Code Playgroud)

filter 的作用其实是 filter&combine,遵循 split-apply-combine 的逻辑。


Dav*_*ens 2

使用groupby实际上并不以任何方式聚合值。它只是创建分组,因此filter本质上是对原始数据帧进行过滤。我不认为您首先通过分组来节省时间或计算,除非name通过将函数应用于组来实现价值。

因此我会推荐类似的东西

df.where(df.name > 0).groupby('A')  # now apply some transformation to the groups
Run Code Online (Sandbox Code Playgroud)