我有一个具有以下结构的Pandas DataFrame(大约1亿行):
Date Value ID
'1/1/17' 500 1
'1/2/17' 550 1
'1/4/17' 600 2
如果我这样做:
def get_coeff_var(group):
group['coeff_var'] = group['Value'].std()/group['Value'].mean()
return group
df = df.groupby(['ID']).apply(lambda x: get_coeff_var(x))
它完成得非常快。
但是如果我首先将索引设置为日期并获得数据的最后一个月,那么相同的apply函数需要一个巨大的(即我甚至不能等待它完成)时间量:
df = df.set_index('Date')
df = df.last('1M')
df = df.groupby(['ID']).apply(lambda x: get_coeff_var(x))
发生了什么?
答案 0 :(得分:1)
几乎总是,在一个groupby-apply内变异是一个坏主意 - 通常它需要一个缓慢的路径,虽然我不确定这里究竟是什么问题。
在您的情况下,执行此转换的惯用方法和更快速的方法如下所示,无论您的索引如何,都应该快速。
gb = df.groupby('ID')['Value']
df['coeff_var'] = gb.transform('std') / gb.transform('mean')