使用groupby和并行的最有效方法是在pandas中应用过滤器吗?
基本上我要求SQL中的等价物
select *
...
group by col_name
having condition
我认为有许多用例,包括条件均值,总和,条件概率等,这些都会使这样的命令非常强大。
我需要一个非常好的性能,所以理想情况下这样的命令不会是在python中完成的几个分层操作的结果。
答案 0 :(得分:42)
如unutbu的评论所述,groupby's filter相当于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
你可以编写更复杂的函数(这些函数适用于每个组),只要它们返回一个普通的'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']))
。
答案 1 :(得分:0)
我按最大值大于20的州和县分组,然后使用数据框loc子查询True的结果值
counties=df.groupby(['state','county'])['field1'].max()>20
counties=counties.loc[counties.values==True]