Python pandas滚动平均数同时保留索引和列

2024-05-16 19:34:04 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个NBA比赛的熊猫数据框。以下是客场球队的数据样本:

                                  away_team  away_efg  away_drb  away_score
date
2000-10-31 19:00:00    Los Angeles Clippers     0.522      74.4          94
2000-10-31 19:00:00         Milwaukee Bucks     0.434      63.0          93
2000-10-31 19:30:00  Minnesota Timberwolves     0.523      73.8         106
2000-10-31 19:30:00       Charlotte Hornets     0.605      77.1         106
2000-10-31 19:30:00     Seattle SuperSonics     0.429      73.1          88

除了away_score列之外,还有更多的数字列,以及与主队类似的列。在

我想要的是,对于每一行,用前面三个观察值的平均值替换数值列(而不是score),并按团队划分。通过执行以下操作,我几乎可以得到我想要的东西:

^{pr2}$

例如,这会返回

>>> home_avg[home_avg["team"]=="Utah Jazz"].head()
         3par        ast   blk        drb       efg       ftr        orb
0         NaN        NaN   NaN        NaN       NaN       NaN        NaN
50        NaN        NaN   NaN        NaN       NaN       NaN        NaN
81   0.146667  71.600000   9.4  74.666667  0.512000  0.347667  25.833333

带着这个,和

>>> home_df[home_df["team"]=="Utah Jazz"].head()
      3par   ast   blk   drb    efg    ftr   orb   stl       team   tov   trb
0    0.118  76.7   7.1  64.7  0.535  0.365  25.6  11.5  Utah Jazz  10.8  42.9
50   0.100  63.9   9.1  80.5  0.536  0.414  27.6   2.2  Utah Jazz  20.2  58.6
81   0.222  74.2  12.0  78.8  0.465  0.264  24.3   7.3  Utah Jazz  13.9  50.0
122  0.119  81.8  11.3  75.0  0.515  0.642  25.0  12.2  Utah Jazz  21.8  52.5
135  0.129  76.7  17.8  75.9  0.650  0.400  37.9   5.7  Utah Jazz  18.8  62.7

演示在计算平均值时包含当前行。我想避免这个。更具体地说,第81行的期望输出将是所有NaNs(因为还没有三个游戏),第122行的3par列中的条目将是.146667(该列中第0、50和81行的值的平均值)。在

所以,我的问题是,如何在滚动平均数计算中排除当前行?在


Tags: 数据homenanastheadteamavg平均值
1条回答
网友
1楼 · 发布于 2024-05-16 19:34:04

您可以在这里使用^{},它将给定数量的索引移位,使滚动窗口使用除当前值外的最后三个值:

# create dummy data frame with numeric values
df = pd.DataFrame({"numeric_col": np.random.randint(0, 100, size=5)})
print(df)

    numeric_col
0   66
1   60
2   74
3   41
4   83

df["mean"] = df["numeric_col"].shift(1).rolling(window=3).mean()
print(df)

    numeric_col     mean
0   66              NaN
1   60              NaN
2   74              NaN
3   41              66.666667
4   83              58.333333

相应地,将apply函数更改为lambda x: x.shift(1).rolling(window=3).mean(),使其在特定示例中工作。在

相关问题 更多 >