熊猫上的 SQL“ GROUPBY HAVING”等价于什么?

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

基本上,我要求在 SQL 中等效

select *
...
group by col_name
having condition

我认为有许多用例,从条件方法,求和,条件概率,等等,这将使这样一个命令非常强大。

我需要非常好的性能,因此理想情况下,这样的命令不会是在 python 中执行多个分层操作的结果。

60383 次浏览

正如 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']))

我按照 max 大于20的州和县进行分组,然后使用 dataframe loc 子查询 True 的结果值

counties=df.groupby(['state','county'])['field1'].max()>20
counties=counties.loc[counties.values==True]