У меня есть фрейм данных со столбцом Country
. В нем есть строки примерно для 15 стран. Я хочу добавить столбец Continent
, используя словарь сопоставлений, ContinentDict
, в котором есть сопоставление от названия страны к названию континента)
Я вижу, что эти два работают
df['Population'] = df['Energy Supply'] / df['Energy Supply per Capita']
df['Continent'] = df.apply(lambda x: ContinentDict[x['Country']], axis='columns')
но это не
df['Continent'] = ContinentDict[df['Country']]
Похоже, проблема в том, что df['Country']
является объектом серии, и поэтому оператор недостаточно умен, чтобы считать последний оператор таким же, как 2.
Вопросы
apply
?df['Continent']=df['Country'].map(ContinentDict)
В случае 1 вы имеете дело с двумя сериями панд, поэтому он знает, как с ними бороться.
В случае 2 у вас есть словарь python и серия панд, панды не знают, как обращаться со словарем (df['country'] - это серия панд, но не ключ в словаре)
Судя по вашему заявлению, словарь карт, ContinentDict
, похоже, что ContinentDict
— это словарь Python. В этом случае,
ContinentDict[some_key]
является чистым вызовом Python, независимо от того, какой объект some_key
. Вот почему третий вызов терпит неудачу, поскольку df['Country']
не находится в ключе словаря (и этого никогда не может быть, поскольку ключи словаря не изменяемы).
В этом случае Python позволяет индексировать только точный ключ и выдает ошибку, когда ключа нет в словаре.
Pandas предоставляет вам инструмент для замены/сопоставления значений:
df['Continent'] = df['Country'].map(ContinentDict)
Если вы действительно хотите получить ответ на вопрос 1, вы должны перефразировать свой пост, сосредоточившись только на нем. Если вас интересует только ответ на вопрос 2, найдите ответ в дубликате.