Python:在 pd 中循环访问行时'ValueError: can only convert an array of size 1 to a Python scalar'。数据帧



我想在DataFrame的行上循环,在我的情况下,为许多运动队计算强度评级。

DataFrame列'home_elo''away_elo'包含所涉及球队的赛前强度评级(ELO分数(,并在比赛后的下一场主客场比赛的行中更新(对于主客场比赛,每支球队在任何时间点都有两个强度评级(,其中update_elo(a,b,c)返回。

相应的代码片段如下所示:

for index in df.index:
counter = counter + 1
# Calculation of post-match ELO scores for home and away teams
if df.at[index,'updated'] == 2: # Update next match ELO scores if not yet updated but pre-match ELO scores available
try:
all_home_fixtures = df.date_rank[df['localteam_id'] == df.at[index,'localteam_id']]
next_home_fixture = all_home_fixtures[all_home_fixtures > df.at[index,'date_rank']].min()
next_home_index = df[(df['date_rank'] == next_home_fixture) & (df['localteam_id'] == df.at[index,'localteam_id'])].index.item()
except ValueError:
print('ERROR 1 at' + str(index))
df.at[index,'updated'] = 4
try:
all_away_fixtures = df.date_rank[df['visitorteam_id'] == df.at[index,'visitorteam_id']]
next_away_fixture = all_away_fixtures[all_away_fixtures > df.at[index,'date_rank']].min()
next_away_index = df[(df['date_rank'] == next_away_fixture) & (df['visitorteam_id'] == df.at[index,'visitorteam_id'])].index.item()
except ValueError:
print('ERROR 2 at' + str(index))
df.at[index,'updated'] = 4
# print('Current: ' + str(df.at[index,'fixture_id']) + '; Followed by: ' + str(next_home_fixture))
# print('Current date rank: ' + str(df.at[index,'date']) + ' ' + str(df.at[index,'date_rank']) + '; Next home date rank: ' + str(df.at[next_home_index,'date_rank']) + '; Next away date rank: ' + str(df.at[next_away_index,'date_rank']))
df.at[next_home_index, 'home_elo'] = update_elo(df.at[index,'home_elo'],df.at[index,'away_elo'],df.at[index,'actual_score'])
df.at[next_away_index, 'away_elo'] = update_elo(df.at[index,'away_elo'],df.at[index,'home_elo'],1 - df.at[index,'actual_score']) # Swap function inputs for away team

df.at[next_home_index, 'updated'] = df.at[next_home_index, 'updated'] + 1
df.at[next_away_index, 'updated'] = df.at[next_away_index, 'updated'] + 1
df.at[index,'updated'] = 3

代码对前几行运行良好。然而,我会遇到错误,总是针对相同的行,尽管我看不出这些行与其他行有什么不同。

  1. 如果我不处理如上所示的ValueError,则在大约250行之后,我第一次收到错误消息ValueError: can only convert an array of size 1 to a Python scalar
  2. 如果我如上所示处理ValueError,我会捕获四个这样的错误,每个错误处理块两个(否则代码工作正常(,但代码在所有行的大约18%之后停止更新任何进一步的强度评级,而不会抛出任何错误消息

如果您能帮助我(a(了解错误的原因以及(b(如何处理错误,我将不胜感激。

由于这是我在StackOverflow上的第一篇帖子,我还没有完全了解论坛的常见发帖实践。如果我的帖子有什么可以改进的地方,请告诉我。

非常感谢!

FYI,

如果将.item应用于numpy数组,则会出现类似的错误。

在这种情况下,您可以使用.tolist()来解决它。

pd.Series.item需要系列中至少有一个项才能返回标量。如果:

df[(df['date_rank'] == next_home_fixture) & (df['localteam_id'] == df.at[index,'localteam_id'])]

是长度为0的系列,则.index.item()将抛出ValueError。

相关内容

  • 没有找到相关文章