我有一个如下所示的数据框:
index Player Team Matchup Game_Date WL Min PTS FGM FGA FG% 3PM 3PA 3P% FTM FTA FT% OREB DREB REB AST STL BLK TOV PF Plus_Minus Triple_Double Double_Double FPT 2PA 2PM 2P% Home_Away
276100 1 John Long TOR TOR @ BOS 04/20/1997 W 6.0 0.0 0.0 3.0 0.0 0.0 1.0 0.0 0.0 0.0 0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 2.0 0.0 0.0 1.50 2.0 0.0 0.000000 Away
276101 2 Walt Williams TOR TOR @ BOS 04/20/1997 W 29.0 7.0 3.0 9.0 33.3 1.0 2.0 50.0 0.0 0.0 0 3.0 3.0 3.0 2.0 2.0 1.0 1.0 3.0 20.0 0.0 0.0 19.75 7.0 2.0 28.571429 Away
276102 3 Todd Day BOS BOS vs. TOR 04/20/1997 L 36.0 22.0 8.0 17.0 47.1 4.0 8.0 50.0 2.0 2.0 100 8.0 8.0 6.0 4.0 0.0 0.0 3.0 8.0 -21.0 0.0 0.0 36.00 9.0 4.0 44.444444 Home
276103 4 Doug Christie TOR TOR @ BOS 04/20/1997 W 39.0 27.0 8.0 19.0 42.1 3.0 9.0 33.3 8.0 8.0 100 8.0 8.0 1.0 5.0 3.0 1.0 0.0 8.0 30.0 0.0 0.0 45.25 10.0 5.0 50.000000 Away
276104 5 Brett Szabo BOS BOS vs. TOR 04/20/1997 L 25.0 5.0 1.0 4.0 25.0 0.0 0.0 0 3.0 4.0 75.0 1.0 1.0 3.0 1.0 0.0 0.0 0.0 1.0 -11.0 0.0 0.0 10.25 4.0 1.0 25.000000 Home
我想添加一个新列,它采用每个旧列并给出其 x 天移动平均线。但是,我想要每个独特人物的移动平均线。例如,约翰·朗(John Long)可以在一个独特的日期玩数百场比赛。我希望他的移动平均数只反映他的表现。我已经看过熊猫中的 df.rolling() 函数,我不知道如何制作它,所以它会单独查看每个玩家。任何帮助将不胜感激。
Name Date Points MA
0 Joe Smith 1-1-19 10 NA
1 Sam Simmons 1-1-19 20 NA
2 Joe Smith 1-2-19 30 20
3 Sam Simmons 1-2-19 40 30
您可以将
groupby
与rolling
和mean
一起使用,然后按join
添加新列:
df['Date'] = pd.to_datetime(df['Date'], format='%m-%d-%y')
s = df.set_index('Date').groupby('Name')['Points'].rolling(2, freq='D').mean().rename('MA')
df = df.join(s, on=['Name','Date'])
print (df)
Name Date Points MA
0 Joe Smith 2019-01-01 10 NaN
1 Sam Simmons 2019-01-01 20 NaN
2 Joe Smith 2019-01-02 30 20.0
3 Sam Simmons 2019-01-02 40 30.0
从@jezrael上面的答案以及这里另一个问题的答案中汲取灵感,这里有一个按玩家运行平均值的解决方案 - 没有日期窗口大小限制。
# Get the running count of Names, sorted by Date, Name
df['NameCount'] = df.sort_values(['Date','Name'], ascending=True).groupby('Name').cumcount() + 1
# Running sum of points, in the same order as above (important)
df['PointSum'] = df.sort_values(['Name','NameCount'], ascending=True).groupby('Name')['Points'].cumsum()
df['MA'] = df['PointSum']/df['NameCount']
# Drop the unneeded columns
df = df.drop(['NameCount', 'PointSum'], axis=1)
@MaxU 在此处提供的 cumcount() 方法,作为 SQL 行号的模拟,按方法划分