64

使用 groupby 并在 pandas 中并行应用过滤器的最有效方法是什么?

基本上我要求 SQL 中的等价物

select *
...
group by col_name
having condition

我认为有很多用例,包括条件均值、总和、条件概率等,这将使这样的命令非常强大。

我需要一个非常好的性能,所以理想情况下这样的命令不会是在 python 中完成的几个分层操作的结果。

4

2 回答 2

82

正如 unutbu 的评论中提到的,groupby 的过滤器相当于 SQL 的 HAVING:

In [11]: df = pd.DataFrame([[1, 2], [1, 3], [5, 6]], columns=['A', 'B'])

In [12]: df
Out[12]:
   A  B
0  1  2
1  1  3
2  5  6

In [13]: g = df.groupby('A')  #  GROUP BY A

In [14]: g.filter(lambda x: len(x) > 1)  #  HAVING COUNT(*) > 1
Out[14]:
   A  B
0  1  2
1  1  3

您可以编写更复杂的函数(这些函数应用于每个组),只要它们返回一个普通的 ol' bool:

In [15]: g.filter(lambda x: x['B'].sum() == 5)
Out[15]:
   A  B
0  1  2
1  1  3

注意:可能存在一个错误,您无法编写函数来对您曾经用于 groupby 的列进行操作...一种解决方法是手动 groupby 列,即g = df.groupby(df['A'])).

于 2014-02-28T22:36:16.993 回答
0

我按最大大于 20 的州和县分组,然后使用数据框 loc 子查询 True 的结果值

counties=df.groupby(['state','county'])['field1'].max()>20
counties=counties.loc[counties.values==True]
于 2020-04-13T20:46:56.197 回答