2016-03-06 126 views
5

當對熊貓羣組操作的結果執行過濾時,它會返回一個數據幀。但假設我想進行進一步的組計算,我不得不再次調用groupby,這看起來有點像。有沒有更習慣於這樣做的方式?如何過濾Pandas GroupBy對象並獲取GroupBy對象?

編輯:

爲了說明什麼我談論:

我們無恥地從大熊貓文檔偷玩具數據幀,並組:

>>> dff = pd.DataFrame({'A': np.arange(8), 'B': list('aabbbbcc')}) 
>>> grouped = dff.groupby('B') 
>>> type(grouped) 
<class 'pandas.core.groupby.DataFrameGroupBy'> 

這會返回一個GROUPBY對象,我們可以迭代,執行組合操作等。但是,如果我們過濾:

>>> filtered = grouped.filter(lambda x: len(x) > 2) 
>>> type(filtered) 
<class 'pandas.core.frame.DataFrame'> 

我們找回一個數據幀。是否有一種很好的慣用方式來獲取過濾後的組,而不僅僅是屬於過濾組的原始行?

+1

請舉個例子說說你在說什麼。 – BrenBarn

+1

我認爲這是一個很好的queston,在SQL中你可以將groupby和filter結合起來作爲'SELECT用戶,SUM(喜歡)GROUP BY用戶HAVING sum(喜歡)> 10',而在熊貓中你將不得不做'df。 groupby('user')。filter(lambda x:len(x)> 10).groupby('user')。likes.sum()';也許答案是在'groupby'中包含filter關鍵字或在'filter'中包含'as_index'關鍵字? – maxymoo

+0

@BrenBarn:添加示例。 –

回答

1

如果你想過濾和聚集,我能想到的將是你的過濾器相結合,並使用三元ifapply聚集的最佳方式,過濾組返回None結合,然後dropna刪除這些行從最終結果:

grouped.apply(lambda x: x.sum() if len(x) > 2 else None).dropna() 

如果你想通過組迭代,說要加入他們重新走到一起,你可以使用一臺發電機理解

pd.concat(g for i,g in grouped if len(g)>2) 

最終我認爲如果groupby.filter有一個返回groupby對象的選項會更好。

+0

他希望實際的團體回來,而不是他們的總和。 – BrenBarn