平均值取决于行值

2024-09-27 00:15:43 发布

您现在位置:Python中文网/ 问答频道 /正文

我在熊猫中有以下数据帧:

Visitor    Home     Visitor_rtg    Home_rtg
 Sixers    Celtics     83.4         100.7
 Thunder   Warriors    97.7         105.6
 Bucks     Hornets     110.2        109.2
 Pelicans  Sixers      88.1         89.2
 Hornets   Wizards     90.1         102.3

我想做的是保持每个团队的rtg滚动平均值,不管他们是家里人还是访客。例如,在第四行中,6人的主场是86.3,因为(83.4+89.2) / 2。黄蜂队的最后一排应该是99.65,因为(109.2+90.1)/2我已经找到了df.rolling(),但我不知道如何得到这个,只计算每个队。排序也很重要,因为我想跟踪整个赛季的评级进展。你知道吗

预期产量:

Visitor    Home     Visitor_rtg    Home_rtg
 Sixers    Celtics     83.4         100.7
 Thunder   Warriors    97.7         105.6
 Bucks     Hornets     110.2        109.2
 Pelicans  Sixers      88.1         *86.3
 Hornets   Wizards     *99.65        102.3

Tags: 数据home团队平均值visitorthunderwizards主场
3条回答

stack+concat+groupby+mean

IIUC,您可以^{}您的数据帧,和^{}+^{}值。不需要rolling

f = df[['Visitor', 'Home']].stack().reset_index(drop=True)
s = df[['Visitor_rtg', 'Home_rtg']].stack().reset_index(drop=True)
pd.concat([f, s], axis=1).groupby(0)[1].mean()

输出

Bucks       110.2
Celtics     100.7
Hornet      109.2
Pelicans     88.1
Sixers       86.3
Thunder      97.7
Warriors    105.6
Name: 1, dtype: float64

编辑答案

要获得所需的输出,可以使用expanding(不滚动)获得平均值,并使用transform广播回每个原始行。最后,只需reshape您的dataframe的底层值即可获得最终输出

df2 = pd.concat([f, s], axis=1)
df2[1] = df2.groupby(0).transform(lambda s: s.expanding().mean())
pd.DataFrame(df2.values.reshape(-1,4), columns=df.columns)


    Visitor     Home    Visitor_rtg Home_rtg
0   Sixers      83.4    Celtics     100.7
1   Thunder     97.7    Warriors    105.6
2   Bucks       110.2   Hornets     109.2
3   Pelicans    88.1    Sixers      86.3
4   Hornets     99.65   Wizards     102.3

不是特别令人愉快的解决方案:

df = pd.DataFrame([['Sixers', 'Celtics', 83.4, 100.7], 
                   ['Pelicans', 'Sixers', 88.1, 89.2]], 
                  columns=['Visitor', 'Home', 'Visitor_rtg', 'Home_rtg'])
melted = df.melt(['Visitor', 'Home'])
pd.concat([melted.loc[melted['variable'] == 'Visitor_rtg', ['Visitor', 'value']].rename(columns={'Visitor': 'Team'}), 
            melted.loc[melted['variable'] == 'Home_rtg', ['Home', 'value']].rename(columns={'Home': 'Team'})], 
           axis=0, 
           ignore_index=True
      ).groupby('Team').mean()

您可以使用底层reshape数组上的numpy来获得有效的解决方案。你知道吗


步骤1
有相当多的重塑涉及,最后把数据放入一个emptynumpy数组。你知道吗

home = df.iloc[:, [1,3]]
away = df.iloc[:, [0,2]]
total = np.empty((home.shape[0] * 2, home.shape[1]), dtype=object)
total[::2] = away
total[1::2] = home

步骤2
现在我们已经格式化了数据,我们可以使用expanding.mean和更多的整形

d = pd.DataFrame({'team': total[:, 0], 'score': total[:, 1].astype(float)}) 
out = d.groupby('team').score.expanding().mean().reset_index().sort_values(by='level_1') 

pd.DataFrame(
    out[['team', 'score']].values.reshape(-1, 4)[:, [0,2,1,3]],
    columns=df.columns
)

    Visitor      Home Visitor_rtg Home_rtg
0    Sixers   Celtics        83.4    100.7
1   Thunder  Warriors        97.7    105.6
2     Bucks   Hornets       110.2    109.2
3  Pelicans    Sixers        88.1     86.3
4   Hornets   Wizards       99.65    102.3

相关问题 更多 >

    热门问题