2016-07-27 147 views
2

如果我有一個簡單的表格,如:先進的聚集大熊貓蟒蛇

index location  col1 col2 col3 col4 
    1   a  TRUE yes  1  4 
    2   a FALSE null  2  6 
    3   b  TRUE null  6  3 
    4   b  TRUE  no  3  4 
    5   b FALSE yes  4  6 
    6   c  TRUE  no  57  8 
    7   d FALSE null  74  9 

如果我想聚集在位置重複的記錄,即兩個A或三個B的,我一直在使用一個基本groupby函數。這適用於簡單的表格。

但是,是否可以擴展此功能,以便在聚合時允許每列的規則?作爲col1的一個例子,如果TRUE存在,它會勝過任何FALSE值,或者在col3中,它會對這些值進行求和,而在col4中它會計算平均值?是否可以爲每列定義這些規則,然後在使用groupby時應用它們?

我在網上搜索,但沒有發現任何似乎覆蓋這個,但我可能會吠叫錯誤的樹。

謝謝。

+0

您可以發佈想要的/預期的數據集嗎? – MaxU

回答

4

使用groupbyagg

funcs = dict(
    col1=dict(Trump=lambda x: x.any()), 
    col3='sum', 
    col4=dict(Avg='mean') 
) 

df.groupby('location').agg(funcs) 

enter image description here


當與多個列groupby對象上使用agg,可以傳遞一個dict定義適用於哪一列,其功能。

在這個高級字典(funcs)中,鍵是應用在該值中定義的函數的現有列名稱。

例如:

agg({'col1': lambda x: x.any(), 'col2': 'sum'}) 

說對col2col1sum使用any()。如果數據幀中不存在col1col2,則會失敗。

此外,我們不必使用來自此聚合的默認列名稱。我將運行上面的小例子來說明。

df.groupby('location').agg({'col1': lambda x: x.any(), 'col3': 'sum'}) 

enter image description here

沒有太多說明什麼,我們已經做到了。如果我們將字典作爲函數傳遞,我們可以根據需要描述函數,關鍵是描述,值是函數。我將使用相同的示例,但用更好的描述進行擴展。

df.groupby('location').agg(
    {'col1': {'All I need is one True': lambda x: x.any()}, 
    'col3': {'SUMMATION': 'sum'}}) 

enter image description here

武裝與信息,希望我的解決方案是非常合情合理的。

+0

++用於閱讀; – MaxU

+0

@MaxU謝謝:-) – piRSquared

+0

@piRSquared多麼美妙的答案!感謝您抽出時間! :d – DGraham