Pandas ValueError: можно преобразовать только массив размером 1 в скаляр Python - PullRequest
0 голосов
/ 05 мая 2020

Со следующим кодом:

#Bring in the 'player matches' dataframe
df_pm = sql('select * from PlayerMatchesDetail', c).drop('TableIndex', axis=1)
df_pm['GoalInv'] = df_pm['Goals']+df_pm['GoalAssists']

df_pm.head(3) # THIS PRINTS FINE (see below)

# We need to associate a match ID to each row here, so that we can groupby properly.    
def MatchIDLookup(gw, ht, at):
    '''
    Takes a gameweek, hometeam, and awayteam,
    and returns the matchID of the game
    '''
    return int(df_fixtures.loc[(df_fixtures['GameWeek']==gw)
                  &(((df_fixtures['HomeTeam']==ht)
                     &(df_fixtures['AwayTeam']==at))
                   |((df_fixtures['HomeTeam']==at)
                     &(df_fixtures['AwayTeam']==ht))),'MatchID'].item())

#Apply the function to insert the matchID
df_pm['MatchID'] = df_pm.apply(lambda x: MatchIDLookup(x['GameWeek'],
                                                       x['ForTeam'],
                                                       x['AgainstTeam']), axis=1)

#Create a multi-index
df_pm.set_index(['MatchID','Player'], inplace=True)

#We now create columns in the player match dataframe, describing their expected goals, assists, and goal involvement.

#Goals
df_pm['XG'] = df.groupby(['MatchID','Player']).sum()[['XG']]
#Assists
df_pm['XA'] = df.groupby(['MatchID','AssistedBy']).sum()[['XG']]

#Fill NAs with 0s
df_pm.fillna(0, inplace=True)

#Calculate goal Involvement
df_pm['XGI'] = df_pm['XG'] + df_pm['XA']

# Let's see how player gameweeks are distributed...
plt.figure(figsize=(10,3))
plt.hist(df_pm['XG'], label='XG', bins=30)

plt.xlim(0)
plt.ylim(0,1000)
plt.title('Distribution of player XG in each match')

plt.figure(figsize=(10,3))
plt.hist(df_pm['XA'], label='XGA', bins=30, color=color_list[1])

plt.xlim(0)
plt.ylim(0,1000)
plt.title('Distribution of player XA in each match')

plt.figure(figsize=(10,3))
plt.hist(df_pm['XGI'], label='XGI', bins=30, color=color_list[2])

plt.xlim(0)
plt.ylim(0,1000)
plt.title('Distribution of player XGI in each match');
plt.show()

Я получаю следующую трассировку:

Traceback (most recent call last):
  File "expected_goals.py", line 365, in <module>
    x['AgainstTeam']), axis=1)
  File "/Users/me/anaconda2/envs/data_science/lib/python3.7/site-packages/pandas/core/frame.py", line 6878, in apply
    return op.get_result()
  File "/Users/me/anaconda2/envs/data_science/lib/python3.7/site-packages/pandas/core/apply.py", line 186, in get_result
    return self.apply_standard()
  File "/Users/me/anaconda2/envs/data_science/lib/python3.7/site-packages/pandas/core/apply.py", line 296, in apply_standard
    values, self.f, axis=self.axis, dummy=dummy, labels=labels
  File "pandas/_libs/reduction.pyx", line 620, in pandas._libs.reduction.compute_reduction
  File "pandas/_libs/reduction.pyx", line 128, in pandas._libs.reduction.Reducer.get_result
  File "expected_goals.py", line 365, in <lambda>
    x['AgainstTeam']), axis=1)
  File "expected_goals.py", line 360, in MatchIDLookup
    &(df_fixtures['AwayTeam']==ht))),'MatchID'].item())
  File "/Users/me/anaconda2/envs/data_science/lib/python3.7/site-packages/pandas/core/base.py", line 652, in item
    return self.values.item()
ValueError: can only convert an array of size 1 to a Python scalar

Примечания:

df.fixtures печатает нормально:

                 MatchID  GameWeek       Date        HomeTeam                 AwayTeam
FixturesBasicID                                                                      
1                 46605         1 2019-08-09       Liverpool             Norwich City
2                 46606         1 2019-08-10     Bournemouth         Sheffield United
3                 46607         1 2019-08-10         Burnley              Southampton
4                 46608         1 2019-08-10  Crystal Palace                  Everton
5                 46609         1 2019-08-11  Leicester City  Wolverhampton Wanderers

И, перед использованием MatchIDLookup(), df_pm.head(3) также печатает нормально:

                                Player  GameWeek  Minutes    ForTeam  ... CreatedCentre  CreatedLeft  CreatedRight  GoalInv
PlayerMatchesDetailID                                                 ...                                                  
1                              Alisson         1       90  Liverpool  ...             0            0             0        0
2                      Virgil van Dijk         1       90  Liverpool  ...             0            0             0        1
3                         Joseph Gomez         1       90  Liverpool  ...             0            0             0        0

Как исправить это?

1 Ответ

0 голосов
/ 05 мая 2020

Не пробуя, я считаю, что проблема заключается в int() при возврате функции MatchIDLookup(). Pandas обычно этого не допускает. Вместо этого верните значение без преобразования в int, а затем добавьте ниже:

df_pm['MatchID'] = df_pm['MatchID'].astype(int)

PS Кроме того, я бы обычно не советовал преобразовывать идентификаторы любого типа в целые числа, но сохранять их как строки - простая причина, если идентификатор начинается с нуля (0654 или 0012), преобразовав его в целое число, вы потеряете формат 4 di git.

РЕДАКТИРОВАТЬ:

def MatchIDLookup(gw, ht, at):

    res = df_fixtures.loc[(df_fixtures['GameWeek']==gw)
                  &(((df_fixtures['HomeTeam']==ht)
                     &(df_fixtures['AwayTeam']==at))
                   |((df_fixtures['HomeTeam']==at)
                     &(df_fixtures['AwayTeam']==ht))),'MatchID']

    return res.item() if len(res) > 0 else 'not found' ```
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...