64

groupby を使用し、並行してパンダにフィルターを適用する最も効率的な方法は何でしょうか?

基本的に、私は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

より複雑な関数を書くことができます (これらは各グループに適用されます)、単純なブール値を返す場合:

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

注: groupby に使用した列に作用する関数を記述できないというバグがある可能性がありg = df.groupby(df['A']))ます...回避策は、列を手動で groupby することです。

于 2014-02-28T22:36:16.993 に答える