我可以征求更有效(更快)迭代的建议吗?
这是问题所在,我正在寻找一种在确定的窗口大小内在 Pandas DataFrame 中向下传播零的方法:

import numpy as np 
import pandas as pd 
 
A = np.matrix([[ 0.,  1.,  1.,  1.,  1.], 
           [ 1.,  0.,  1.,  1.,  1.], 
           [ 1.,  1.,  0.,  1.,  1.], 
           [ 1.,  1.,  1.,  0.,  1.], 
           [ 1.,  1.,  1.,  1.,  0.], 
           [ 1.,  1.,  1.,  1.,  1.], 
           [ 1.,  1.,  1.,  1.,  1.], 
           [ 1.,  1.,  1.,  1.,  1.], 
           [ 1.,  1.,  1.,  1.,  0.], 
           [ 1.,  1.,  0.,  1.,  1.], 
           [ 1.,  1.,  1.,  1.,  1.], 
           [ 1.,  1.,  1.,  1.,  1.], 
           [ 1.,  1.,  1.,  1.,  1.], 
           [ 1.,  1.,  1.,  1.,  1.], 
           [ 1.,  1.,  1.,  0.,  1.], 
           [ 1.,  1.,  1.,  1.,  1.], 
           [ 1.,  1.,  0.,  1.,  1.], 
           [ 1.,  1.,  1.,  1.,  0.], 
           [ 1.,  0.,  1.,  1.,  1.], 
           [ 1.,  1.,  1.,  1.,  1.]]) 
 
df = pd.DataFrame(A) 

现在我们想通过每个 3 行的窗口的增量来填充
来自顶部的值。
每个 3 行窗口从 window_start 开始,定义为:
window_size = 3 
window_start = [i for i in range(0, df.shape[0])  
                if i % window_size == 0] 
print(df) 
gf = df.copy() 
print('\n') 

现在制作数据帧,其中零从
该窗口内的前几行:
for i in window_start: 
for j in range(1, window_size): 
    try: gf.iloc[i + j] = gf.iloc[i + j - 1] * gf.iloc[i + j] 
    except: pass 
 
print(gf) 

对于非常大的数据集,最后一点非常低效且耗时,有没有更好的方法来做到这一点?

请您参考如下方法:

您应该能够使用 groupby 中的累积产品完成此任务。 .

df.groupby(np.arange(len(df)) // 3).cumprod() 
 
      0    1    2    3    4 
0   0.0  1.0  1.0  1.0  1.0 
1   0.0  0.0  1.0  1.0  1.0 
2   0.0  0.0  0.0  1.0  1.0 
3   1.0  1.0  1.0  0.0  1.0 
4   1.0  1.0  1.0  0.0  0.0 
5   1.0  1.0  1.0  0.0  0.0 
6   1.0  1.0  1.0  1.0  1.0 
7   1.0  1.0  1.0  1.0  1.0 
8   1.0  1.0  1.0  1.0  0.0 
9   1.0  1.0  0.0  1.0  1.0 
10  1.0  1.0  0.0  1.0  1.0 
11  1.0  1.0  0.0  1.0  1.0 
12  1.0  1.0  1.0  1.0  1.0 
13  1.0  1.0  1.0  1.0  1.0 
14  1.0  1.0  1.0  0.0  1.0 
15  1.0  1.0  1.0  1.0  1.0 
16  1.0  1.0  0.0  1.0  1.0 
17  1.0  1.0  0.0  1.0  0.0 
18  1.0  0.0  1.0  1.0  1.0 
19  1.0  0.0  1.0  1.0  1.0 

我们可以通过使用 concat 更好地查看看看它是否在做我们想要的。
pd.concat([df.iloc[:6, :2], d1.iloc[:6, :2]], axis=1, keys=['Before', 'After']) 
 
  Before      After      
       0    1     0    1 
0    0.0  1.0   0.0  1.0 
1    1.0  0.0   0.0  0.0 
2    1.0  1.0   0.0  0.0 
3    1.0  1.0   1.0  1.0 
4    1.0  1.0   1.0  1.0 
5    1.0  1.0   1.0  1.0 

我的看法 numpy方法
请参阅@Divakar 的解决方案,因为我借用了他的功能的一些元素
def prop_zero(df, window_size=3): 
    a = df.values 
    W = window_size 
    m, n = a.shape 
 
    pad = np.zeros((W - m % W, n)) 
    b = np.vstack([a, pad]) 
 
    return pd.DataFrame( 
        b.reshape(-1, W, n).cumprod(1).reshape(-1, n)[:m], 
        df.index, df.columns 
    ) 
 
prop_zero(df) 


评论关闭
IT干货网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!