一般标题为“如果有大量组,groupby会很慢”的文件
nobs = 9999
df = DataFrame( { 'id' : np.arange(nobs) / 3,
'yr' : np.tile( np.array([2007,2008,2009]), nobs/3 ),
'val': np.random.randn(nobs) } )
df = df.sort(['id','yr'])
A = df.groupby('id').shift()
B = df.shift()
A是我想要的,但是这里大约需要1.5秒,而我的实际用例大约是观察值的100倍.作为参考,计算A比计算B慢大约1000倍.
这是A和B的样子:
In [599]: A.head(6)
Out[599]:
val yr
0 NaN NaN
1 -0.839041 2007
2 -1.089094 2008
3 NaN NaN
4 -0.068383 2007
5 0.555293 2008
In [600]: B.head(6)
Out[600]:
id val yr
0 NaN NaN NaN
1 0 -0.839041 2007
2 0 -1.089094 2008
3 0 0.050604 2009
4 1 -0.068383 2007
5 1 0.555293 2008
我希望有一个通用的解决方案来加快A的运行速度,但是如果没有这种解决方案,一种解决方法将非常有用.如您所见,B实际上与A相同,只是每个组的第一个值不是真正有效,需要转换为NaN.可以用groupby / rank来完成,但是任何涉及groupby的东西似乎都很慢,因此我需要一个非groupby方法.
有什么方法可以通过排序或索引来复制等级函数?似乎信息必须嵌入其中,但是我不知道如何将其提取到新变量中.
(编辑后添加以下内容)
以下是Jeff提供的链接中的解决方案(HYRY的原始答案).我只是对其稍作改动,以处理此处的示例.在我的计算机上,它的运行速度几乎与DSM的解决方案相同.
B.iloc [df.groupby(‘id’).size().cumsum()[:-1]] = np.nan