Pandas 上的 SQL“GROUP BY HAVING”等价物是啥?

Posted

技术标签:

【中文标题】Pandas 上的 SQL“GROUP BY HAVING”等价物是啥?【英文标题】:What is the equivalent of SQL "GROUP BY HAVING" on Pandas?Pandas 上的 SQL“GROUP BY HAVING”等价物是什么? 【发布时间】:2014-04-02 01:30:13 【问题描述】:

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

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

select *
...
group by col_name
having condition

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

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

【问题讨论】:

@AndyHayden 写了一个使用groupby-filter 的nice example。我认为filterhaving condition 的熊猫等价物。 【参考方案1】:

正如 unutbu 的评论中提到的,groupby's filter 相当于 SQL'S 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

注意:potentially there is a bug 在这里你不能编写函数来作用于你用来分组的列...一种解决方法是手动分组列,即g = df.groupby(df['A']))

【讨论】:

可能会添加到与 SQL 的比较部分? (本例) @Jeff good call,看着,不知道是否应该考虑同时使用agg 过滤器的例子(我认为没有办法轻松做到这一点而无需进行第二次 groupby ...)这可能是这个问题:s 只是链接 em(但你确实需要第二个 groupby):DataFrame([[1, 2], [1, 3], [2, 5], [2, 8], [5, 6]], columns=['A', 'B']).groupby('A').filter(lambda x: len(x)>1).groupby('A').sum() 对于更复杂的情况我不得不使用.apply()***.com/questions/23394476/…【参考方案2】:

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

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

【讨论】:

以上是关于Pandas 上的 SQL“GROUP BY HAVING”等价物是啥?的主要内容,如果未能解决你的问题,请参考以下文章

将 1100 万行从 Postgresql 导入到 Pandas/Python

挑战SQL:图解pandas的数据合并merge函数

Pandas SQL 块大小

pandas 饼图 plot 删除楔形上的标签文本

Pandas实现常用SQL操作

PANDAS 中类似 SQL 的窗口函数:Python Pandas Dataframe 中的行编号