2017-06-19 52 views
18

我想對熊貓數據框做一些聚合。下面是一個示例代碼:熊貓聚集警告(FutureWarning:使用與重命名的字典已過時)

import pandas as pd 

df = pd.DataFrame({"User": ["user1", "user2", "user2", "user3", "user2", "user1"], 
        "Amount": [10.0, 5.0, 8.0, 10.5, 7.5, 8.0]}) 

df.groupby(["User"]).agg({"Amount": {"Sum": "sum", "Count": "count"}}) 

Out[1]: 
     Amount  
     Sum Count 
User    
user1 18.0  2 
user2 20.5  3 
user3 10.5  1 

產生以下警告:

FutureWarning:使用與重命名的字典被棄用,並將於 在未來的版本中迴歸超去除(DataFrameGroupBy, 自我).aggregate(arg,* args,** kwargs)

我該如何避免這種情況?

+1

我很想知道這是爲什麼正在貶值(我敢肯定有一個很好的理由)。有沒有人有鏈接到它的討論? –

回答

23

使用GROUPBY apply,並返回一個系列重命名列

使用GROUPBY apply方法來執行

  • 重命名列
  • 在名稱
  • 允許允許對空間的聚合您以任何您選擇的方式訂購返回的列
  • 允許在列之間進行交互
  • 返回單級索引而不是一個多指標

要做到這一點:

  • 創建您傳遞給apply
  • 此自定義函數傳遞每個組的數據框自定義函數
  • 迴歸系列
  • 該系列的索引將是新的列

製造假數據

df = pd.DataFrame({"User": ["user1", "user2", "user2", "user3", "user2", "user1", "user3"], 
        "Amount": [10.0, 5.0, 8.0, 10.5, 7.5, 8.0, 9], 
        'Score': [9, 1, 8, 7, 7, 6, 9]}) 

enter image description here

創建返回
變量x系列裏面的my_agg是一個數據幀

def my_agg(x): 
    names = { 
     'Amount mean': x['Amount'].mean(), 
     'Amount std': x['Amount'].std(), 
     'Amount range': x['Amount'].max() - x['Amount'].min(), 
     'Score Max': x['Score'].max(), 
     'Score Sum': x['Score'].sum(), 
     'Amount Score Sum': (x['Amount'] * x['Score']).sum()} 

    return pd.Series(names, index=['Amount range', 'Amount std', 'Amount mean', 
            'Score Sum', 'Score Max', 'Amount Score Sum']) 
自定義函數

通過這個自定義函數的GROUPBY apply方法

df.groupby('User').apply(my_agg) 

enter image description here

最大的缺點是,這個功能會比aggcythonized aggregations

慢得多使用帶進行分組的字典agg方法

使用詞典詞典由於其複雜性和有點模糊的性質,因此被刪除。有一個ongoing discussion關於如何在github上將來改進此功能在這裏,您可以在groupby調用之後直接訪問聚合列。只需傳遞您希望應用的所有聚合函數的列表。

df.groupby('User')['Amount'].agg(['sum', 'count']) 

輸出

 sum count 
User    
user1 18.0  2 
user2 20.5  3 
user3 10.5  1 

但仍可以用字典來明確表示不同的聚合的不同列,喜歡這裏,如果有一個名叫Other另一個數字列。

df = pd.DataFrame({"User": ["user1", "user2", "user2", "user3", "user2", "user1"], 
       "Amount": [10.0, 5.0, 8.0, 10.5, 7.5, 8.0], 
       'Other': [1,2,3,4,5,6]}) 

df.groupby('User').agg({'Amount' : ['sum', 'count'], 'Other':['max', 'std']}) 

輸出

 Amount  Other   
     sum count max  std 
User        
user1 18.0  2  6 3.535534 
user2 20.5  3  5 1.527525 
user3 10.5  1  4  NaN 
+7

但是,假設您也希望重命名方面,在聚合後具有與默認值不同的列名稱。有一些語法仍然可以獲得這個功能嗎? – ErnestScribbler

+1

對命名有同樣的問題,因爲我使用同一個列兩次(一分鐘和一個最大),並且當我將結果放回對象時,需要一種方式來唯一地引用它們。 – mgmonteleone

+0

如果你想重命名列,你將不得不手動完成。要麼使用一個列表來替換所有的'df.columns = ['your','new','col','names']'或使用'rename'方法,這會有點困難,因爲你有這個結果在MultiIndex中。 –