Python 在保留组的同时,过滤熊猫中GroupBy之后的组

Python 在保留组的同时,过滤熊猫中GroupBy之后的组,python,pandas,pandas-groupby,Python,Pandas,Pandas Groupby,在熊猫中,我想做: df.groupby('A')。筛选(lambda x:x.name>0)-按列分组A,然后筛选名称值为非正数的组。但是,这会取消分组为GroupBy.filter返回DataFrame,从而丢失分组。我希望按此顺序执行,因为它应该不太需要计算,因为filter后跟groupby将遍历数据帧两次否(首先过滤,然后分组)?另外,从分组中克隆组(到dict或其他东西)将失去无缝返回数据帧的功能(如直接获得数据帧的.filter) 谢谢 例如: A B 1 -1 1 2

在熊猫中,我想做:
df.groupby('A')。筛选(lambda x:x.name>0)
-按列分组
A
,然后筛选名称值为非正数的组。但是,这会取消分组为
GroupBy.filter
返回
DataFrame
,从而丢失分组。我希望按此顺序执行,因为它应该不太需要计算,因为
filter
后跟
groupby
将遍历数据帧两次否(首先过滤,然后分组)?另外,从分组中克隆组(到dict或其他东西)将失去无缝返回数据帧的功能(如直接获得数据帧的
.filter

谢谢

例如:

   A  B
1 -1  1
2 -1  2
3  0  2
4  1  1
5  1  2
df.groupby('A')

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


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

因此,我推荐类似的产品

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

我们来安排一下时间

df = pd.DataFrame({'A':np.random.randint(-10,10,1000000),'B':np.random.random(1000000)})
测试两个返回值的see是否相等

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

每个回路59.7 ms±724µs(7次运行的平均值±标准偏差,每个10个回路)


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

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

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

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

以下是一个例子:


假设你想按“C”分组,然后过滤组中“A”的和(我像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的数据帧方法

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


不幸的是,我没有找到任何与iloc等效的有用方法或函数(我检查了“nth”、“take”和“get_group”,但它们都不起作用)。

您能在这里放一个数据帧数据的示例吗?:)为什么不简单地按
df
,而按
df[df['a']>0]分组呢
?因为我预计这将花费两倍于第一次分组然后过滤组的时间,因为我将过滤10个组,而不是1mil rowsok,这是有意义的:)但是为了创建组,您需要遍历整个数据帧否?我的意思是,如果你
groupby
你必须检查每一行,如果你过滤数据帧,那么整个数据帧也需要两次迭代,但是如果我只过滤组,我在整个数据帧上走一次,但只在组上走一次,这与我说的不完全一样。我说过按组名过滤10个组比过滤整个数据集然后分组整个数据集要快,因为过滤和分组(我假设)都是线性时间操作。然而,如果我尝试你的例子,那么
df[df.A>=0].groupby('A')
{name:group代表name,group in df.groupby('A').groups.items()如果name>=0}
更快,所以我想我不必太担心这个速度。
%timeit df1 = df.groupby('A').filter(lambda x: x.name >= 0)
%timeit df2 = df[df.A >= 0]
df.groupby(['C']).filter(lambda x:x['A'].sum()<700, combine=False).std()
df.groupby(['C']).filter(lambda x:x['A'].sum()<700).groupby(['C']).std()
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()