我一直在尝试优化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部分,可以节省几毫秒!
有人能朝我正确的方向推吗?
答案 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。但是我不知道它是否会更出色。无论哪种方式,最好对代码进行概要分析并改善实际瓶颈。