[英]How to aggregate values from multiple columns from a Pandas DataFrameGroupBy object?
[英]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).
如果你給 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 調用。 一個是“平均”,一個是“總和”。
您還可以將任何 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。
您還可以為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 調用。 如果您希望使用多列計算相同的操作,請使用此選項
如果將字典作為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.