Ошибка типа Python: строковые индексы должны быть целыми числами, создавая новый столбец, используя существующие столбцы во фрейме данных - PullRequest
0 голосов
/ 28 ноября 2018

Я пытаюсь создать дополнительный пользовательский столбец, используя существующий столбец фрейма данных, однако функция, которую я использую, выдает ошибку типа во время выполнения.Я очень новичок в Python, может кто-нибудь, пожалуйста, помогите.

Используемый кадр данных, как показано ниже

match_all = match[['country_id','league_id','season','stage','date',
'home_team_api_id','away_team_api_id','home_team_goal','away_team_goal']]

И функция, которую я использую, как показано ниже

def goal_diff(matches):
    for i in matches:
        i['home_team_goal']-i['away_team_goal']

goal_diff(match_all)

1 Ответ

0 голосов
/ 28 ноября 2018

Причина, по которой ваша функция не сработала, заключается в том, что matches в вашей функции - это фрейм данных.Когда вы сделаете:

for i in matches:
    print(i)

Вы увидите, что имена столбцов возвращаются из вашего текущего df.Вот как цикл for работает на df.Так что в вашей функции, когда вы используете i в вызове вычитания:

i['home_team_goal'] -i['away_team_goal']

это похоже на выполнение

['country_id']['home_team_goal'] - ['country_id']['away_team_goal'] 
['league_id']['home_team_goal'] - ['league_id']['away_team_goal']
...

Эта операция в пандах не имеет никакого смысла.То, что вы на самом деле хотите делать, когда вызываете определенные столбцы данных, это имя df со столбцом:

matches['home_team_goal'] - matches['away_team_goal']

Помните, совпадения - это ввод df вашей функции.Наконец, в цикле for вы не возвращаете ни одно значение и не сохраняете никакого значения, вы просто вызываете метод вычитания в 2 столбцах.В вашем текстовом редакторе или IDE вы можете увидеть что-то, выводимое на экран, но в будущем вы, вероятно, захотите использовать эти значения для следующего шага в вашем коде.Поэтому в функции мы используем вызов return, чтобы функция фактически давала нам значения, когда мы вызываем ее для чего-то.

В вашем случае, если я напишу свою функцию ниже без вызова return,и затем вызовите функцию на моем фрейме данных, операция завершится, и мне не будет «возвращено» никакое значение, оно просто будет создано и исчезнет.

Предварительно отредактированный ответ.

Вам не нужно создавать цикл для этого, pandas сделает это за вас:

def goal_dff(matches):
    return matches['home_team_goal'] - matches['away_team_goal']
match_all['home_away_goal_diff'] = goal_diff(match_all)

Эта функция принимает входной df и использует столбцы home_team_goal и away_team_goal для вычисления разницы.Вам также не нужна функция для этого.Если вы хотите создать новый столбец в существующем match_all df, вы можете сделать это:

match_all['home_away_goal_diff'] = match_all['home_team_goal'] - match_all['away_team_goal']
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...