2016-12-30 34 views
1

Pandas中的一個人如何在同一數據集上進行多步/順序聚合?就好像每一步都是下一個的「子查詢」一樣。熊貓數據框中的多步聚合

我可以在SQL認爲它是這樣的:

SELECT x.A, COUNT(x.B) as B_COUNT, SUM(x.C_SUM) as C_SUM 
FROM (
    SELECT df.A, df.B, SUM(df.C) as C_SUM 
    FROM df 
    GROUP BY df.A, df.B 
) x 
GROUP BY x.A 

在Python3.4和Pandas0.19.2工作,我有這樣一個數據幀:

import pandas 
import numpy 

numpy.random.seed(1) 
df = pandas.DataFrame({'A' : ['foo', 'bar', 'foo', 'bar', 
          'foo', 'bar', 'foo', 'foo'], 
        'B' : ['one', 'one', 'two', 'three', 
          'two', 'two', 'one', 'three'], 
        'C' : numpy.random.randn(8), 
        'D' : numpy.random.randn(8)}) 

我試過彙總到A,B級,然後在那個數據幀上工作(也就是說,它的索引是'C',而列'A'由於它不在鍵列表中而引發KeyError

A_B_AGG = df.groupby(['A','B']).C.sum().to_frame() 
A_B_AGG.keys() 
#Index(['C'], dtype='object') 
#Would like to do this, but throws KeyError 
end_result = A_B_AGG.groupby('A').B.size() 

最終,我應該得到的東西,看起來像...

A B_COUNT  C_SUM 
bar  3 -3.986264 
foo  3 2.945186 

感謝您對這樣做的正確,熊貓方式的任何指導!

回答

1

可以使用agg功能:

df.groupby('A').agg({'B': pandas.Series.nunique, 'C': 'sum'}) 

#    C B 
#A  
#bar -3.986264 3 
#foo  2.945186 3 

我認爲這等同於您的SQL查詢的原因是,當你被列A和B做組,那麼就會出現在每個沒有B的重複一個小組。因此,按A分組的B的計數將與按A分組的B的唯一計數相同;對於C sum,子組的總數與組的總和相同。


這是一個直接翻譯你的SQL查詢的,我認爲邏輯上等同於上述方法:

(df.groupby(['A', 'B']).C.sum().reset_index() 
    .groupby('A').agg({'B': 'count', 'C': 'sum'})) 

#    C B 
# A  
#bar -3.986264 3 
#foo  2.945186 3 
+0

當你'C.sum()'會發生什麼其他列? 'D'列會發生什麼?當你做羣組時,你可以聚合少數列並留下其他人嗎? – MYGz

+1

@MYGz他們被忽略。當你做'groupby(...)。C'意味着你選擇了「C」列和組變量。 – Psidom

+0

謝謝!所以如果我們想在不同的列上進行不同類型的聚合,我們必須使用'.agg()'。 – MYGz