Кнопка Boolean Series будет переиндексирована в соответствии с индексом DataFrame

Вот как я столкнулся с ошибкой:

df.loc[a_list][df.a_col.isnull()]

Тип a_list - Int64Index, он содержит список индексов строк. Все эти индексы строк относятся к df.

Часть df.a_col.isnull() - это условие, необходимое для фильтрации.

Если я выполняю следующие команды индивидуально, я не получаю никаких предупреждений:

df.loc[a_list]
df[df.a_col.isnull()]

Но если я поместил их в df.loc[a_list][df.a_col.isnull()], я получу предупреждающее сообщение (но я вижу результат):

Кнопка Boolean Series будет переиндексирована в соответствии с индексом DataFrame

В чем смысл этого сообщения об ошибке? Это влияет на результат, который он вернул?

Ответ 1

Ваш подход будет работать, несмотря на предупреждение, но лучше не полагаться на неявное, неясное поведение.

Решение 1, сделать выбор индексов в a_list логической маской:

df[df.index.isin(a_list) & df.a_col.isnull()]

Решение 2, сделайте это в два этапа:

df2 = df.loc[a_list]
df2[df2.a_col.isnull()]

Решение 3, если вы хотите использовать однострочник, используйте хитрость, найденную здесь:

df.loc[a_list].query('a_col != a_col')

Предупреждение исходит из того факта, что логический вектор df.a_col.isnull() имеет длину df, а df.loc[a_list] имеет длину a_list, т.е. короче. Поэтому некоторые индексы в df.a_col.isnull() отсутствуют в df.loc[a_list].

Pandas выполняет переиндексацию логического ряда в индексе вызывающего фрейма данных. Фактически он получает из df.a_col.isnull() значения, соответствующие индексам в a_list. Это работает, но поведение неявно, и может легко измениться в будущем, так что о чем предупреждение.