Pandas:DataFrameGroupby 的聚合
Posted
技术标签:
【中文标题】Pandas:DataFrameGroupby 的聚合【英文标题】:Pandas: Aggregate of DataFrameGroupby 【发布时间】:2020-11-08 19:14:37 【问题描述】:我正在使用这个数据集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).
【问题讨论】:
【参考方案1】:怎么样:
df.groupby('STNAME')[['POPESTIMATE2010','POPESTIMATE2011']].agg(['mean', 'sum'])
请注意,在这种情况下,您需要在 groupby 之后使用双方括号。
【讨论】:
不,您需要一对括号[]
才能访问这些列。在括号内,您需要传递一列或 list 列。在这里,你需要一个列表,所以你需要两对。
这行得通!但它也适用于单括号。
我也很惊讶它使用一对括号(使用 pandas 0.24.2)。我不知道这是否是 groupby()
的一个功能使这成为可能,因为访问 df['POPESTIMATE2010','POPESTIMATE2011']
会引发 KeyError(如预期的那样)。【参考方案2】:
试试这个,
import numpy as np
df.set_index('STNAME').groupby(level=0).agg(
"POPESTIMATE2010": [np.average, np.sum], "POPESTIMATE2011": [np.average, np.sum])
【讨论】:
【参考方案3】:虽然其他人很快就给出了单行代码 sn-p,但我尝试更多地解释一下你有哪些选项,以及 pandas agg()
函数理解的语法是什么。
我们在处理什么?
你正在处理的对象的类型是
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) 字符串(函数名)
如果你给函数名字符串作为参数,它必须是一个“熊猫能理解的函数名”。理解的函数名称至少是:'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
...
由于您想要计算两件事:均值和总和,因此您需要两个函数调用。一个是“mean”,一个是“sum”。
(2) 函数
您也可以将任何函数作为参数。该函数应该将类似数组的数据(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
...
由于您想要计算两件事:均值和总和,因此您需要两个函数调用。一个是 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
...
这样做的好处是您只需要一个函数调用。 如果您希望使用多列计算相同的操作,请使用此选项
(4) 字典到列名 -> 函数
如果您将字典作为 agg()
的参数,则 keys 必须代表数据框中的 列名,并且值应该是函数或函数列表。示例:
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
...
这样做的好处是您只需要一个函数调用。 如果您希望使用不同的列计算不同的操作,请使用此选项
【讨论】:
令人印象深刻,感谢您的努力。 您用一个用例解释了每个选项,这正是我需要理解的。谢谢!【参考方案4】:正如您看到的错误,它清楚地表明我们必须指定一个函数或 (column,aggfunc) 的元组。
以下是调用agg函数的正确方法
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.
【讨论】:
以上是关于Pandas:DataFrameGroupby 的聚合的主要内容,如果未能解决你的问题,请参考以下文章