2017-04-02 96 views
1

我對NBA比賽的統計數據的大熊貓數據幀。下面是客場強隊的數據樣本:Python的大熊貓滾動平均值,同時保留索引和列

        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列之外更多的數字列,並且也類似於列。

我想,對於每一行,與前三個觀測的平均值,由團隊劃分更換數字列(比其他得分)。我可以幾乎得到我想要的東西通過執行以下操作:

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行所希望的輸出將是所有NaN S(因爲還沒有三場還),以及用於122行中的3par列中的項將是0.146667(平均的值的該列中爲第0,50和81行)。

所以,我的問題是,我怎麼能排除當前行中的滾動平均值計算?

回答

2

您可以使用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()到讓它在你的具體例子中工作。

+0

真棒,謝謝! – user4601931