[英]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.