簡體   English   中英

Pandas:DataFrameGroupby 的聚合

[英]Pandas: Aggregate of DataFrameGroupby

我正在使用這個數據集census.csv

代碼:

df = pd.read_csv('Data/census.csv')
df = df[df['SUMLEV']==50]

print(df.head())

這就是我的數據的樣子:

   SUMLEV  REGION  DIVISION  ...  RNETMIG2013  RNETMIG2014 RNETMIG2015
1      50       3         6  ...    -2.722002     2.592270   -2.187333
2      50       3         6  ...    22.727626    20.317142   18.293499
3      50       3         6  ...    -7.167664    -3.978583  -10.543299
4      50       3         6  ...    -5.403729     0.754533    1.107861
5      50       3         6  ...    -1.402476    -1.577232   -0.884411

我想在按“STNAME”分組后匯總兩列:

(df.set_index('STNAME').groupby(level=0)['POPESTIMATE2010','POPESTIMATE2011'].agg(Avg= np.average, Sum = np.sum))

錯誤:

----> 3 (df.set_index('STNAME').groupby(level=0)['POPESTIMATE2010','POPESTIMATE2011'].agg(Avg= np.average, Sum = np.sum))

f:\software_installations\anaconda3\lib\site-packages\pandas\core\groupby\generic.py in aggregate(self, func, *args, **kwargs)
    922         elif func is None:
    923             # nicer error message
--> 924             raise TypeError("Must provide 'func' or tuples of '(column, aggfunc).")
    925 
    926         func = _maybe_mangle_lambdas(func)

TypeError: Must provide 'func' or tuples of '(column, aggfunc).

雖然其他人很快就給出了單行代碼片段,但我嘗試更多地解釋一下您擁有的選項類型,以及 pandas agg() function 理解的語法是什么。

我們在處理什么?

您正在處理的 object 的類型是

type(df.set_index('STNAME').groupby(level=0)[['POPESTIMATE2010','POPESTIMATE2011']])
# pandas.core.groupby.generic.DataFrameGroupBy

因此,查看pandas.DataFrameGroupby.agg的文檔可能是一個很好的開始

文檔怎么說?

agg的參數可以是

(1) string (function name)
(2) function
(3) list of functions
(4) dict of column  names -> functions (or list of functions).

(1) 字符串(函數名)

如果你給 function 名稱字符串作為參數,它必須是“pandas 理解的函數名稱”。 了解 function 名稱至少為: 'sum','mean','std' 例子:

In [24]: df.set_index('STNAME').groupby(level=0)[['POPESTIMATE2010','POPESTIMATE2011']].agg('mean')
Out[24]:
                      POPESTIMATE2010  POPESTIMATE2011
STNAME
Alabama                  71420.313433     71658.328358
Alaska                   24621.413793     24921.379310
Arizona                 427213.866667    431248.800000
...

由於您想要計算兩件事:均值和總和,因此您需要兩個 function 調用。 一個是“平均”,一個是“總和”。

(2) function

您還可以將任何 function 作為參數。 function 應該將類數組數據(pd.Series)作為輸入,並從中產生標量值。 例子:

In [25]: df.set_index('STNAME').groupby(level=0)[['POPESTIMATE2010','POPESTIMATE2011']].agg(np.mean)
Out[25]:
                      POPESTIMATE2010  POPESTIMATE2011
STNAME
Alabama                  71420.313433     71658.328358
Alaska                   24621.413793     24921.379310
...

由於您想要計算兩件事:均值和總和,因此您需要兩個 function 調用。 一個帶有 np.mean,一個帶有 np.sum。

(3) 函數列表

您還可以為agg()的參數提供函數列表。 例子:

In [27]: df.set_index('STNAME').groupby(level=0)[['POPESTIMATE2010','POPESTIMATE2011']].agg([np.mean, np.sum])
Out[27]:
                     POPESTIMATE2010           POPESTIMATE2011
                                mean       sum            mean       sum
STNAME
Alabama                 71420.313433   4785161    71658.328358   4801108
Alaska                  24621.413793    714021    24921.379310    722720
Arizona                427213.866667   6408208   431248.800000   6468732
...

這樣做的好處是您只需要一個 function 調用。 如果您希望使用多列計算相同的操作,請使用此選項

(4) 字典到列名 -> 函數

如果將字典作為agg()的參數,則必須代表 dataframe 中的列名,值應該是函數或函數列表 例子:

In [30]: In [27]: df.set_index('STNAME').groupby(level=0)[['POPESTIMATE2010','POPESTIMATE2011']].agg({"POPESTIMATE2010": [np.mean, np.sum], "POPESTIMATE2011": [np.mean, np.sum]})
Out[30]:
                     POPESTIMATE2010           POPESTIMATE2011
                             average       sum            mean       sum
STNAME
Alabama                 71420.313433   4785161    71658.328358   4801108
Alaska                  24621.413793    714021    24921.379310    722720
Arizona                427213.866667   6408208   431248.800000   6468732
...

這樣做的好處是您只需要一個 function 調用。 如果您希望使用不同的列計算不同的操作,請使用此選項

怎么樣:

df.groupby('STNAME')[['POPESTIMATE2010','POPESTIMATE2011']].agg(['mean', 'sum'])

請注意,在這種情況下,您需要在 groupby 之后使用雙方括號。

嘗試這個,

import numpy as np

df.set_index('STNAME').groupby(level=0).agg(
    {"POPESTIMATE2010": [np.average, np.sum], "POPESTIMATE2011": [np.average, np.sum]})

正如您看到的錯誤,它清楚地表明我們必須指定 function 或 (column,aggfunc) 的元組。

以下是調用 agg function 的正確方法

df.set_index('STNAME').groupby(level=0)[['POPESTIMATE2010','POPESTIMATE2011']].agg(['mean','sum'])

如果您注意到 groupby ( [[ ]]) 之后的雙括號,因為 panda 建議否則,您將收到如下警告

FutureWarning: Indexing with multiple keys (implicitly converted to a tuple of keys) will be deprecated, use a list instead.

此外,您正在使用 np.avarage 它將為空切片提供溫暖,如下所示:

RuntimeWarning: Mean of empty slice.

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM