熊猫groupby试图优化几个步骤

时间:2020-05-16 07:58:23

标签: pandas-groupby

我一直在尝试优化bokeh服务器以计算Covid19上所选国家/地区的实时统计信息。

我发现自己重复了groupby函数来计算新列,并且想知道选择了groupby之后,是否可以以类似于.agg()的方式将其应用于多个列?

例如:

dfall = pd.DataFrame(db("SELECT * FROM C19daily"))
dfall.set_index(['geoId', 'date'], drop=False, inplace=True)
dfall = dfall.sort_index(ascending=True)

dfall.head()

                      id        date geoId  cases  deaths          auid
geoId date                                                            
AD    2020-03-03  70119  2020-03-03    AD      1       0  AD03/03/2020
      2020-03-14  70118  2020-03-14    AD      1       0  AD14/03/2020
      2020-03-16  70117  2020-03-16    AD      3       0  AD16/03/2020
      2020-03-17  70116  2020-03-17    AD      9       0  AD17/03/2020
      2020-03-18  70115  2020-03-18    AD      0       0  AD18/03/2020

我需要基于“ cases”和“ deaths”创建新列,并应用cumsum()之类的各种功能。目前,我已经完成了很长的路途

dfall['ccases'] = dfall.groupby(level=0)['cases'].cumsum()
dfall['dpc_cases'] = dfall.groupby(level=0)['cases'].pct_change(fill_method='pad', periods=7)
    .....
dfall['cdeaths'] = dfall.groupby(level=0)['deaths'].cumsum()
dfall['dpc_deaths'] = dfall.groupby(level=0)['deaths'].pct_change(fill_method='pad', periods=7)

我试图像这样优化groupby调用:-

with dfall.groupby(level=0) as gr:
    gr = g['cases'].cumsum()...

但是错误提示该类不支持此操作

AttributeError: __enter__

我认为我可以使用.agg({})并提供字典

g = dfall.groupby(level=0).agg({'cc' : 'cumsum', 'cd' : 'cumsum'})  

但是会产生另一个错误

pandas.core.base.SpecificationError: nested renamer is not supported

我还有很多其他方面需要优化,我认为这是最简单的python部分,可以节省几毫秒!

有人能朝我正确的方向推吗?

1 个答案:

答案 0 :(得分:0)

为避免重复dfall.groupby(level=0),您可以将其保存在变量中:

gb = dfall.groupby(level=0)
gb_cases = gb['cases']

dfall['ccases'] = gb_cases.cumsum()
dfall['dpc_cases'] = gb_cases.pct_change(fill_method='pad', periods=7)
...

要使用单个表达式运行多个聚合,我想您可以使用named aggregation。但是我不知道它是否会更出色。无论哪种方式,最好对代码进行概要分析并改善实际瓶颈。