Pandas .loc возвращает ошибку ключа для некоторых меток

#python #pandas #data-science

#python #pandas #наука о данных

Вопрос:

Я создаю функцию, которая возвращает ‘id’ для ввода названия продукта.

 
                   id
pName   
ZYMOFLAM D TAB 10s  1
ZYROP INJ 10000IU   2
ZYROP INJ 4000IU    3
ZYTANIX TAB 5MG 10s 4
ZYTEE RB GEL 10ML   5

  
 df.loc['ZYTANIX TAB 5MG 10s']
  

ВОЗВРАТ

 id    4
Name: ZYTANIX TAB 5MG 10s, dtype: int64
  

но df.loc['ZYTEE RB GEL 10ML']
возвращает KeyError

Почему это происходит?

Комментарии:

1. Проверьте, print (df.index.tolist()) может traling whitespace , тогда нужно df.index = df.index.str.strip()

2. ([‘ZYMOFLAM D TAB 10s’, ‘ZYROP INJ 10000IU’, ‘ZYROP INJ 4000IU’, ‘ZYTANIX TAB 5 МГ 10s’, ‘ZYTEE RB GEL 10ML’]) нет завершающего пробела.

3. тогда понятия не имею. Это должно работать нормально.

4. @jezrael спасибо за попытку помочь. Возможны ли неузнаваемые пробелы между словами в названии элемента?

5. если использовать df.index = df.index.str.strip(), это поможет?

Ответ №1:

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

 df = df.reset_index()
df['pName'] = df.pName.apply(lambda x: ' '.join(x.strip().split(' ')))
df = df.set_index('pName')
  

теперь попробуйте

 df.loc['ZYTEE RB GEL 10ML']
  

Комментарии:

1. Эта функция apply преобразует все метки в NAN

2. Прямо сейчас я работаю над заменой всех пробелов между ними. (df[‘pName’] = df[‘pName’].str.replace(» «,»»»)). Это не выдает ошибку ключа. Но мне все еще нужно найти правильное решение с пробелами.

3. Извините, произошла ошибка. Я обновил код. Надеюсь, теперь это сработает.