Pandas:DataFrameGroupby的聚合

2024-09-30 01:34:33 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在处理这个数据集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).

Tags: csv数据dfindexnplevelaggfunc
3条回答

虽然其他人很快给出了一行代码片段,但我试图解释更多关于您拥有的选项类型,以及pandasagg()函数所理解的语法

我们在处理什么

您正在处理的对象的类型是

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
...

由于需要计算两件事:均值和和和,因此需要两个函数调用。一个是“平均”,一个是“总和”

(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()的参数,则必须表示数据帧中的列名,值应为函数或函数列表。例如:

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
...

这样做的好处是,您只需要一个函数调用如果希望使用不同的列计算不同的运算,请使用此选项

试试这个

import numpy as np

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

那么:

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

注意,在这种情况下,groupby后面需要双方括号

相关问题 更多 >

    热门问题