python熊猫代码_python-熊猫:向量化局部范围操作([i:i 2]行...

通过索引将Series.rolling与更改顺序一起使用,将max与和一起使用:

df['TempMax'] = df['Temperature'].iloc[::-1].rolling(3, min_periods=1).max()

df['RainTotal'] = df['Rain'].iloc[::-1].rolling(3, min_periods=1).sum()

print (df)

Day Temperature Rain TempMax RainTotal

0 0 30 4 31.0 18.0

1 1 31 14 31.0 14.0

2 2 31 0 33.0 5.0

3 3 30 0 34.0 5.0

4 4 33 5 34.0 5.0

5 5 34 0 34.0 2.0

6 6 32 0 33.0 7.0

7 7 33 2 33.0 16.0

8 8 31 5 31.0 14.0

9 9 29 9 29.0 9.0

另一个更快的解决方案是将numpy中的strides用于2d数组,然后将numpy.nanmax与numpy.nansum结合使用:

n = 2

t = np.concatenate([df['Temperature'].values, [np.nan] * (n)])

r = np.concatenate([df['Rain'].values, [np.nan] * (n)])

def rolling_window(a, window):

shape = a.shape[:-1] + (a.shape[-1] - window + 1, window)

strides = a.strides + (a.strides[-1],)

return np.lib.stride_tricks.as_strided(a, shape=shape, strides=strides)

df['TempMax'] = np.nanmax(rolling_window(t, n + 1), axis=1)

df['RainTotal'] = np.nansum(rolling_window(r, n + 1), axis=1)

print (df)

Day Temperature Rain TempMax RainTotal

0 0 30 4 31.0 18.0

1 1 31 14 31.0 14.0

2 2 31 0 33.0 5.0

3 3 30 0 34.0 5.0

4 4 33 5 34.0 5.0

5 5 34 0 34.0 2.0

6 6 32 0 33.0 7.0

7 7 33 2 33.0 16.0

8 8 31 5 31.0 14.0

9 9 29 9 29.0 9.0

性能:

#[100000 rows x 3 columns]

df = pd.concat([df] * 10000, ignore_index=True)

In [23]: %%timeit

...: df['TempMax'] = np.nanmax(rolling_window(t, n + 1), axis=1)

...: df['RainTotal'] = np.nansum(rolling_window(r, n + 1), axis=1)

...:

8.36 ms ± 165 ?s per loop (mean ± std. dev. of 7 runs, 100 loops each)

In [24]: %%timeit

...: df['TempMax'] = df['Temperature'].iloc[::-1].rolling(3, min_periods=1).max()

...: df['RainTotal'] = df['Rain'].iloc[::-1].rolling(3, min_periods=1).sum()

...:

20.4 ms ± 1.35 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值