Pandas — поведение / Проблема с переиндексацией против loc для установки значений

#python-3.x #pandas

#python-3.x #pandas

Вопрос:

Я пытался использовать reindex вместо loc в pandas, поскольку начиная с 0.24 появляется предупреждение о переиндексации с помощью списков.

Проблема, с которой я сталкиваюсь, заключается в том, что я использую loc для изменения значений моих фреймов данных.
Теперь, если использовать переиндексацию, я теряю это, и если я пытаюсь быть умным, я даже получаю ошибку.

Рассмотрим следующий случай:

 df = pd.DataFrame(data=pd.np.zeros(4, 2), columns=['a', 'b'])
ds = pd.Series(data=[1]*3)
  

Я хочу изменить подмножество значений (при сохранении остальных), чтобы df сохранить ту же форму.

Итак, это исходное поведение, которое работает (и изменяет значения в подмножестве df[‘a’] на 1)

 df.loc[range(3), 'a'] = ds
  

Но когда я использую переиндексацию, я ничего не могу изменить:

 df.reindex(range(3)).loc['a'] = ds
  

Теперь, когда я пытаюсь что-то вроде этого:

 df.loc[:, 'a'].reindex(range(3)) = ds
  

Я получаю SyntaxError: can't assign to function call сообщение об ошибке.

Для справки я использую pandas 0.24 и python 3.6.8

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

1. reindex возвращает копию. Изменение копии не приводит к изменению оригинала. Вот и все.

Ответ №1:

Быстрый ответ от @coldspeed был самым простым, хотя поведение предупреждения вводит в заблуждение. Таким образом, reindex возвращает копию, когда loc этого не происходит. Из документов pandas:

Создается новый объект, если новый индекс не эквивалентен текущему и copy= False.

Таким образом, утверждение, что reindex это альтернатива loc согласно предупреждению, на самом деле вводит в заблуждение.

Надеюсь, это поможет людям, которые сталкиваются с такой же ситуацией.