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

标签 python pandas pandas-groupby

在 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/

相关文章:

python - 当组列中的 NaN 时,Pandas groupby 会应用奇怪的行为

Python Pandas 按多列计数透视分组

python - Pandas - 计算 df 中的行以发现每天的存活率

python - 运行守护进程服务器或 shell 命令?

python - 单击 Scrapy-Splash 中的按钮

python - 如何提取negspacy中的特定单词

python - groupby 多个值,并绘制结果

python - 从列表中完全删除一个项目

python - 如何在Python中解决这个 'transpose'?

python - 转置 Pandas DataFrame 中的列子集,同时使用其他列作为分组变量?