我在熊猫中有以下数据框:
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
答案 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