首页 > 解决方案 > 根据数据框Python(Pandas)中另一列的值计算列的移动平均值

问题描述

我正在尝试为 nba 球员创建一个 10 天移动平均得分列。我的数据框有每个玩家逐场比赛的统计数据,我希望移动平均列包含当时的 10 天移动平均线。我试过 df.groupby('player')['points].rolling(10,1).mean,但这只是给了我当天得分的移动平均数。列出了每天的所有球员,然后数据框移动到第二天,所以我可以有几百行具有相同日期但不同球员的统计数据。任何帮助将不胜感激。谢谢。

标签: pythonpython-3.xpandasdataframerolling-average

解决方案


如前所述,您确实应该提供一个示例数据集,并展示您想要实现的目标。但是,我喜欢处理运动数据,所以不介意花一分钟左右的时间来获取样本集。

所以基本上你需要对 groupby 做一个滚动平均值。你会注意到每个玩家的前 10 行显然是空白的,因为它没有 10 个日期来取平均值。您可以通过将 min 更改为 1 来更改它。此外,当您这样做时,您希望确保您的数据按日期排序(这里已经是)。

import pandas as pd

player_link_list = ['https://www.basketball-reference.com/players/l/lavinza01/gamelog/2021/',
                    'https://www.basketball-reference.com/players/v/vucevni01/gamelog/2021/',
                    'https://www.basketball-reference.com/players/j/jamesle01/gamelog/2021/',
                    'https://www.basketball-reference.com/players/d/davisan02/gamelog/2021/']

dfs = []
for link in player_link_list:
    w=1
    df = pd.read_html(link)[-1]
    df = df[df['Rk'].ne('Rk')]   
    df = df[df['PTS'].ne('Inactive')]   
    df['Player'] = link.split('/')[-4]
    df['PTS'] = df['PTS'].astype(int,errors = 'ignore')
    dfs.append(df)
    

df = pd.concat(dfs)

df['rolling_10_avg'] = df.groupby('Player')['PTS'].transform(lambda s: s.rolling(10, min_periods=10).mean())  

推荐阅读