1 回答
TA貢獻(xiàn)2039條經(jīng)驗(yàn) 獲得超8個(gè)贊
我認(rèn)為這是一個(gè)排序問題。如果這能解決您的問題,請您嘗試一下:
player_avgs_base.sort_values(["player","game_order"], ascending=False, inplace=True)
如果愿意,您可以在執(zhí)行排序后設(shè)置索引。
另一點(diǎn)是,對于您的代碼,滾動(dòng)不尊重分組。我猜你想計(jì)算每個(gè)玩家的滾動(dòng)總和,對,而不是混合其他玩家的價(jià)值。如果是這樣,您可以使用以下代碼:
df2= df.sort_values(["player",'game_id',"game_order"])
df2['TOI_comp_avg_lt']= df2.groupby('player')['TOI_comp'].apply(lambda ser: ser.rolling(2).mean().shift())
這輸出:
player game_id game_order TOI_comp G_comp TOI_comp_avg_lt
0 A.J..GREER 2016020227 37 16.566667 0 NaN
2 A.J..GREER 2016020251 36 11.733333 0 NaN
4 A.J..GREER 2016020268 35 12.700000 0 14.150000
6 A.J..GREER 2016020278 34 15.433333 0 12.216666
7 A.J..GREER 2016020296 33 11.850000 0 14.066666
1 ZENON.KONOPKA 2013021047 34 12.666666 0 NaN
5 ZENON.KONOPKA 2013021047 35 14.722222 0 NaN
3 ZENON.KONOPKA 2013021047 37 13.111111 0 13.694444
對于以下測試數(shù)據(jù):
import pandas as pd
import io
raw= """A.J..GREER 2016020227 37 16.566667 0
ZENON.KONOPKA 2013021047 34 12.666666 0
A.J..GREER 2016020251 36 11.733333 0
ZENON.KONOPKA 2013021047 37 13.111111 0
A.J..GREER 2016020268 35 12.700000 0
ZENON.KONOPKA 2013021047 35 14.722222 0
A.J..GREER 2016020278 34 15.433333 0
A.J..GREER 2016020296 33 11.850000 0"""
df= pd.read_csv(io.StringIO(raw), sep='\s+', names=['player', 'game_id', 'game_order', 'TOI_comp', 'G_comp'])
順便提一句。你set_index的不能替代排序。該索引對輸出沒有影響。例如,如果您df按照上面的定義使用并執(zhí)行:
df_indexed= df.set_index(["player",'game_id',"game_order"])
df_indexed_result= df_indexed.copy()
df_indexed_result['TOI_comp_shifted']= df_indexed["TOI_comp"].shift()
df_indexed_result['TOI_comp_rolling_mean']= df_indexed["TOI_comp"].rolling(2).mean().shift()
你得到:
TOI_comp G_comp TOI_comp_shifted TOI_comp_rolling_mean
player game_id game_order
A.J..GREER 2016020227 37 16.566667 0 NaN NaN
ZENON.KONOPKA 2013021047 34 12.666666 0 16.566667 NaN
A.J..GREER 2016020251 36 11.733333 0 12.666666 14.616667
ZENON.KONOPKA 2013021047 37 13.111111 0 11.733333 12.200000
A.J..GREER 2016020268 35 12.700000 0 13.111111 12.422222
ZENON.KONOPKA 2013021047 35 14.722222 0 12.700000 12.905555
A.J..GREER 2016020278 34 15.433333 0 14.722222 13.711111
2016020296 33 11.850000 0 15.433333 15.077777
如果您查看該TOI_comp_shifted列,您會(huì)發(fā)現(xiàn)它只是填充了前一列的值,無論player它屬于哪一列(滾動(dòng)平均值也是如此)。所以索引對這個(gè)操作沒有影響。
對于你的第二個(gè)問題。我認(rèn)為循環(huán)應(yīng)該像這樣工作,如果你的數(shù)據(jù)框的列名是好的:
group_obj= df2.groupby('player')
for col in ['TOI_comp', 'G_comp']:
df2[f'{col}_lt']= group_obj[col].apply(lambda ser: ser.rolling(2).mean().shift())
假設(shè)您想以相同的方式將滾動(dòng)平均值應(yīng)用于列列表。
添加回答
舉報(bào)
