我有一个超过4000行的数据帧,我正在根据原始数据帧计算另一个数据帧中第1179行的平均值。如果客场或主队的值计数在循环中的匹配之前低于3,那么我想在第二个数据帧中删除行。
数据帧示例:
Date Match ID Home team Away team Home score Away score
1 2016/11/11 2 Penn St. Wright St. 29 30
2 2016/11/11 3 Southern Ill. N.C. Central 33 34
3 2016/11/11 4 East Carolina Wichita St. 42 21
4 2016/11/11 5 Longwood Colgate 32 42
5 2016/11/11 6 Lipscomb Boston U. 21 21
df = pd.read_csv('test.csv')
df1 = df.iloc[1179:]
matches = []
for a in df1['Match ID']:
matches.append(a)
for match in matches:
match_line = df1.loc[df1['Match ID'] == match]
idx = df.index.get_loc(df[df['Match ID'] == match].index[0])
print(idx)
neki1 = df.iloc[:idx]
home_team = match_line['Home team'].values[0]
away_team = match_line['Away team'].values[0]
home = neki1[neki1['Home team'] == home_team]
home1 = neki1[neki1['Away team'] == home_team]
away = neki1[neki1['Home team'] == away_team]
away1 = neki1[neki1['Away team'] == away_team]
home_score = []
away_score = []
for data in home['Home score']:
home_score.append(data)
for data in home1['Away score']:
away_score.append(data)
df1.loc[df1['Match ID'] == match, 'Home score'] = mean(home_score)
df1.loc[df1['Match ID'] == match, 'Away score'] = mean(away_score)
我尝试过使用value_counts,但没有得到正确的结果,因为它没有正确放置,所以我只想知道将其放置在哪里的逻辑。我希望我清楚:(
IIUC您希望在每场比赛中获得以前分数的平均值:
- 为该团队
- 同侧(主场或客场(
- 从第1179行开始
- 至少3场比赛的平均成绩
这个概念被称为展开变换,这里的变换是平均值(或mean
(。
这应该起作用,大致如下:
df1 = df.iloc[1179:]
df1['Home score'] = df.groupby(['Home team'])['Home score']
.transform(lambda s: s.expanding(3).mean()).iloc[1179:]
df1['Away score'] = df.groupby(['Away team'])['Away score']
.transform(lambda s: s.expanding(3).mean()).iloc[1179:]
基本上我们使用原始数据帧和:
- 按团队分组,只获取该团队的结果
.transform
返回一个具有相同索引的序列,基本上不改变返回的形状- 在变换中,我们现在只有想要求平均值的对策,所以我们运行一个最小值为3的展开平均值
- 最后,我们通过在第1179行之前截断结果来限制
df1
中的内容