繁体   English   中英

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

[英]Filter groups after GroupBy in pandas while keeping the groups

在我想做的pandas中: df.groupby('A').filter(lambda x: x.name > 0) - 按列A分组,然后过滤具有非正名称值的组。 但是,这会取消分组,因为GroupBy.filter返回DataFrame ,从而丢失分组。 我想这样做的顺序作为它应该是少computationaly苛刻的,因为filter ,然后groupby都要走两次数据框无(第一滤波,然后分组)? 从分组中克隆组(到dict或其他东西)也会失去我无缝返回数据帧的功能(就像你直接获得DataFrame.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]

我们来一些时间。

df = pd.DataFrame({'A':np.random.randint(-10,10,1000000),'B':np.random.random(1000000)})

两种回报的看法测试是相同的

df1 = df.groupby('A').filter(lambda x: x.name >= 0)
df2 = df[df.A >= 0]

all(df1 == df2)
True

时序:

%timeit df1 = df.groupby('A').filter(lambda x: x.name >= 0)

每个循环607 ms±10.2 ms(平均值±标准偏差,7次运行,每次1次循环)

%timeit df2 = df[df.A >= 0]

每回路59.7 ms±724μs(平均值±标准偏差,7次运行,每次10次循环)

@jacquot解决方案比分组然后过滤快10倍。

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

所以我推荐一些类似的东西

df.where(df.name > 0).groupby('A')  # now apply some transformation to the groups

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

您创建了组,并且您希望根据组统计信息丢弃或保留某些组,然后执行您在组上实际关注的某些组统计信息。 这应该是可能的,并且在许多情况下很有用,但是,现在只有当你使用两个相同的groupbys时才能将它作为链式命令(据我所知)。

让我们来一个案例:Groupby揭示了一些在项目级别不可过滤的功能(因此以前的过滤不是一个选项)。 例如一组总和。 过滤器中的烦恼是,它返回一个数据帧而不是保持分组,并允许您对组执行进一步的计算。

这是一个例子:

假设您希望按“C”分组并过滤组中的“A”总和(<700),但在过滤后的组中,您实际上需要关注组的标准。 如果过滤器只是对组的过滤器,这将起作用:

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()

实际上过滤和组合的过滤器是什么,它遵循split-apply-combine逻辑。

我理解像petsol这样的问题,而不是Scott,所以Scott给出的例子的等价应该是:

df = d.DataFrame({'A':np.random.randint(-10,10,1000000),'B':np.random.random(1000000)})
df1 = df.groupby('A').filter(lambda x: x['A'].mean()>0).groupby('A').count()

而第二种方法显然无法奏效。

但是,在我找到这个解决方案之前,我只想到它:Groupby对象有一个类似于.iloc的方法用于DataFrames吗?

这样,当您创建Groupby对象时,您可以通过应用具有某个聚合函数的条件(并将其存储为索引对应于每个组的布尔值)来创建过滤器,然后仅在请求的组上应用其他函数。

不幸的是,我没有找到任何有用的方法或功能等同于iloc(我检查了“nth”,“take”和“get_group”,但没有一个工作)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM