熊猫滚动平均值取决于行值

时间:2018-11-14 20:52:40

标签: python pandas

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

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滚动平均值,无论他们是在家还是来访者。因此,例如在第四行中,76个home_rtg将为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

3 个答案:

答案 0 :(得分:1)

stack + concat + groupby + mean

IIUC,您可以stack数据框,并groupby + mean值。无需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的{​​{1}}基础值即可获得最终输出

dataframe

答案 1 :(得分:0)

一个不太令人满意的解决方案:

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()

答案 2 :(得分:0)

您可以在基础reshape数组上使用numpy,以获得有效的解决方案。


第1步
需要进行大量的重塑,最后将数据放入empty numpy数组中。

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