在 Pandas 中我想做的事:
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
df.groupby('A')
:
GroupBy object
-1 : [1, 2]
0 : [3]
1 : [4,5]
GroupBy.filter(lambda x: x.name >= 0)
:
GroupBy object
0 : [3]
1 : [4,5]
最佳答案
我认为之前的答案提出了变通办法,这些变通办法可能对您的情况有用,但没有回答问题。
您创建了群组,并且您希望根据群组统计信息丢弃或保留一些群组,然后对这些群组执行您真正关心的一些群组统计信息。这应该是可能的,并且在许多情况下很有用,但是,只有当您因此使用两个相同的 groupby 时,现在才不可能将其作为链接命令(据我所知)。
让我们举个例子:Groupby 揭示了一些在项目级别基础上不可过滤的特征(因此以前的过滤不是一个选项)。例如一组总和。过滤器中的烦恼是,它返回一个数据帧而不是保留分组并允许您对组执行进一步的计算。
这是一个例子:
假设您想要按“C”分组并过滤组中“A”的总和 (<700),但在过滤后的组中您实际上关心组的标准差。如果 filter 只是对组的过滤器,这将起作用:
df.groupby(['C']).filter(lambda x:x['A'].sum()<700, combine=False).std()
这不起作用(注意过滤器上不存在的 combine=False
选项),这是什么:
df.groupby(['C']).filter(lambda x:x['A'].sum()<700).groupby(['C']).std()
filter做的其实就是filter&combine,遵循split-apply-combine的逻辑。
关于python - 在保留组的同时,在 Pandas 中的 GroupBy 之后过滤组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49831784/