python中shift_python-快速替代grouby / shift

一般标题为“如果有大量组,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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值