как исправить ошибку "size", "index at City" - PullRequest
0 голосов
/ 20 октября 2019

Я пытаюсь сделать пример в разделе Использование Python & Pandas, чтобы заменить NaN в столбце «размер» конкретным значением, в зависимости от города. В приведенном ниже примере я пытаюсь присвоить значение 18, если город является Сент-Луисом.

Я использовал лямбда-функцию, чтобы сделать это, поскольку в исходном кадре данных есть много строк с повторением названий городов. и только немногие из них имеют значения NaN.
когда я запускаю код, я получаю сообщение об ошибке - KeyError: ('size', 'произошел в индексе City')

ниже приведен фрагмент кода-

raw_data = {'City' : ['Dallas', 'Chicago', 'St Louis', 'SFO', 'St Louis'],
            'size': [24, 36, 'NaN', 'NaN', 22],
            'Type' : ['Pie', 'Hallo', 'Zombi', 'Dru', 'Zoro']
}

df = pd.DataFrame(raw_data)
df

df['size'] = df.apply(lambda x : x['size'].fillna(value = 18 if x['City' == 'St Louis'] else x['size'], axis = 1, inplace = True))
df

Ожидается - 18 будет заполнено в столбце размера для фактического Сент-Луиса - KeyError: ('size', 'произошло в индексе City')

Ответы [ 2 ]

1 голос
/ 20 октября 2019

Если все, что вы пытаетесь сделать, это установить размер Сент-Луиса, вы можете выполнить:

df.loc[df['City'] == 'St Louis', 'size'] = 18

Однако, если вы вместо этого хотите установить для всех значений NaN значение 18, вы также можете выполнить:

df.loc[df['size'] == 'NaN', 'size'] = 18

И если вы просто хотите установить размер всех записей в Сент-Луисе, где размер NaN, вы можете сделать:

df.loc[df['City'] == 'St Louis' and df['size'] == 'NaN', 'size'] = 18
0 голосов
/ 20 октября 2019

Существует простое решение с помощью fillna метода

df['size'] = df['size'].fillna(18)

EDITED

Что я не заметил - вы заполняете ячейки NaN строка, не с действительными NaN значениями.

Если вы измените свои входные данные как

raw_data = {'City' : ['Dallas', 'Chicago', 'St Louis', 'SFO', 'St Louis'],
            'size': [24, 36, np.NaN, np.NaN, 22],
            'Type' : ['Pie', 'Hallo', 'Zombi', 'Dru', 'Zoro']
}

, то следующий метод позволит вам повторно заполнить ячейки столбцов size по названиям городов

df = pd.DataFrame(raw_data)
df[['City', 'size']] = df.set_index('City')['size'].fillna({'St Louis': 18, 'SFO': 20}).reset_index()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...