我有一个熊猫DataFrame的统计数字为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列之外,还有更多的数值列,以及主团队的类似列。
我想要的是,对于每一行,将数字列(分数除外)替换为由team划分的前三个观察值的平均值。通过以下操作,我几乎可以得到我想要的:
home_df.groupby("team").apply(lambda x: x.rolling(window=3).mean())这个返回,例如,
>>> 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行的值的平均值)。
所以,我的问题是,在滚动平均计算中,如何排除当前行?
发布于 2017-04-02 17:44:15
您可以在这里使用shift,它移动给定数量的索引,使滚动窗口使用最后三个值(不包括当前值):
# 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因此,将应用函数更改为lambda x: x.shift(1).rolling(window=3).mean(),使其在特定示例中工作。
https://stackoverflow.com/questions/43171376
复制相似问题