2014-02-28 85 views
16

什麼是最有效的方式來使用groupby並行在熊貓應用過濾器?熊貓:什麼是相當於SQL組?

基本上我要求在SQL相當於

select * 
... 
group by col_name 
having condition 

我覺得有很多使用的情況下,從有條件的手段,資金,條件概率等,這些會做出這樣的命令非常強大。

我需要一個非常好的性能,所以理想情況下這樣的命令不會是在python中完成的幾個分層操作的結果。

+6

@AndyHayden寫了一個[很好的例子](http://stackoverflow.com/a/18357933/190597)使用'groupby-filter'。我認爲'過濾器'是'擁有條件'的熊貓等值。 – unutbu

回答

19

正如unutbu的評論中提到,groupby's filter是SQL'S具有相同的:

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 

注:potentially there is a bug,你不能給你寫的功能作​​用於你使用GROUPBY列...一個解決辦法是GROUPBY列手動即g = df.groupby(df['A']))

+0

可能添加到與SQL比較部分? (這個例子) – Jeff

+1

@Jeff很好的調用,看着它,我想知道是否應該考慮同時使用agg *和* filter的例子(我不認爲有一種方法可以輕鬆地做到這一點, groupby ...)可能是這個問題:s –

+2

just chain em(but you do need a second groupby):''DataFrame([[1,2],[1,3],[2,5],[ ('A')。filter(lambda x:len(x)> 1).groupby('A','B'])。 )的.sum()'' – Jeff