Pandas 熊猫-如何通过计算而不是迭代对组进行矢量化

Pandas 熊猫-如何通过计算而不是迭代对组进行矢量化,pandas,Pandas,这里有一个代码剪贴画来模拟我所面临的问题。我在大型数据集上使用迭代 df = pd.DataFrame({'grp':np.random.choice([1,2,3,4,5],500),'col1':np.arange(0,500),'col2':np.random.randint(0,10,500),'col3':np.nan}) for index, row in df.iterrows(): #based on group label, get last 3 values to

这里有一个代码剪贴画来模拟我所面临的问题。我在大型数据集上使用迭代

df = pd.DataFrame({'grp':np.random.choice([1,2,3,4,5],500),'col1':np.arange(0,500),'col2':np.random.randint(0,10,500),'col3':np.nan})

for index, row in df.iterrows():
    #based on group label, get last 3 values to calculate mean
    d=df.iloc[0:index].groupby('grp')
    try:
        dgrp_sum=d.get_group(row.grp).col2.tail(3).mean()
    except:
        dgrp_sum=999
    #after getting last 3 values of group with reference to current row reference, multiply by other rows
    df.at[index,'col3']=dgrp_sum*row.col1*row.col2

如果我想用向量来加速它,我该如何转换这个代码?

你基本上是计算每组的移动平均数。 这意味着您可以按“grp”对数据帧进行分组并计算滚动平均值。 最后,将每行中的列相乘,因为它不依赖于组

df[“col3”]=df.groupby(“grp”).col2.rolling(3,最小周期=1.mean().reset_索引(0,drop=True)
df[“col3”]=df[“col1”、“col2”、“col3”]]。产品(轴=1)
注意:在您的代码中,每个计算的平均值都放在下一行,这就是为什么您可能有这个
try
块的原因

# Skipping last product gives only mean
# np.random.seed(1234)
# print(df[df["grp"] == 2])
     grp  col1  col2        iter      mask
4      2     4     6  999.000000  6.000000
5      2     5     0    6.000000  3.000000
6      2     6     9    3.000000  5.000000
17     2    17     1    5.000000  3.333333
27     2    27     9    3.333333  6.333333

我可能把我的小飞贼简单化了。如果我试着用以前值的平均值来做一个简单的泊松分布呢?