【问题标题】:pandas groupby trying to optimse several stepspandas groupby 尝试优化几个步骤
【发布时间】:2020-05-16 16:21:15
【问题描述】:

我一直在尝试优化散景服务器,以计算 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

我需要根据“病例”和“死亡”创建新列,并应用 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 部分会是最简单的并且可以节省几毫秒!

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

【问题讨论】:

    标签: pandas-groupby


    【解决方案1】:

    为避免重复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。但我不知道它是否会更高效。无论哪种方式,最好对代码进行分析并改善实际瓶颈。

    【讨论】:

    • 谢谢尤金,我不知道我是怎么错过这个清晰的捷径的。可能我因为试图获得“with dfall.groupby(level=0) as gb:”而分心了
    猜你喜欢
    • 2017-11-03
    • 2020-11-19
    • 1970-01-01
    • 1970-01-01
    • 2019-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-28
    相关资源
    最近更新 更多