如果我想得到平均值,但没有以前的数据点,如何在数据帧中删除行



我有一个超过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中的内容

最新更新