Loc в pandas

Может ли кто-нибудь объяснить, почему loc используется в python pandas с примерами, как показано ниже?

for i in range(0, 2):
  for j in range(0, 3):
    df.loc[(df.Age.isnull()) & (df.Gender == i) & (df.Pclass == j+1),
            'AgeFill'] = median_ages[i,j]

Ответы

Ответ 1

Использование .loc рекомендуется здесь, потому что методы df.Age.isnull(), df.Gender == i и df.Pclass == j+1 могут возвращать представление срезов фрейма данных или могут возвращать копию. Это может запутать pandas.

Если вы не используете .loc, вы в конечном итоге вызываете все 3 условия подряд, что приводит к проблеме, называемой цепной индексацией. Когда вы используете .loc, однако вы получаете доступ ко всем своим условиям за один шаг, а pandas больше не путаете.

Вы можете узнать больше об этом, а также некоторые примеры того, когда не использовать .loc приведет к сбою операции в документации pandas.

Простой ответ заключается в том, что, хотя вы часто можете избежать использования .loc и просто набирать (например)

df['Age_fill'][(df.Age.isnull()) & (df.Gender == i) & (df.Pclass == j+1)] \
                                                          = median_ages[i,j]

вы всегда получите предупреждение SettingWithCopy, и ваш код будет немного беспорядочным для него.

По моему опыту .loc мне понадобилось некоторое время, чтобы окунуться в голову, и это немного раздражало обновление моего кода. Но это действительно супер просто и очень интуитивно понятно: df.loc[row_index,col_indexer].

Для получения дополнительной информации см. документацию pandas по Индексация и выбор данных.