В чем разница между pd.isna для столбцов в одной скобке и несколькими скобками? Он не возвращает значения NA в нескольких скобках.

пока я писал сценарий для колонки, я натолкнулся на кое-что очень интересное. Я использовал pd.DataFrame.isna для одного и нескольких столбцов двумя способами. Пока я пишу сценарий в нескольких скобках, pd.df.isna возвращает мне весь код.

      override[override.ORIGINAL_CREDITOR_ID.notna()].shape

override[override[['ORIGINAL_CREDITOR_ID']].notna()].shape

Итак, первая строка возвращает мне 3880 строк и выполняется за 2,5 мс, тогда как вторая возвращает мне все строки, присутствующие в кадре данных переопределения, и это тоже занимает 3,08 с. Есть ли причина, по которой это происходит? Как я могу этого избежать, потому что мне нужно настроить его для передачи нескольких столбцов во втором запросе?

2 ответа

Решение

Первая строка кода - это выбор с помощью логического Series, а второй - выбор с помощью логического DataFrame, и они обрабатываются по-разному, поскольку DataFrames являются 2D и есть 2 оси для выравнивания. В документах pandas есть раздел, посвященный иллюстрации этой разницы .

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

В случае выбора с помощью Boolean DataFrame вы возвращаете объект той же формы, что и исходный, где True значения в Boolean DataFrame сохраняются, и любые Falseзначения заменяются на. (На самом деле это реализовано как DataFrame.where) Для строк и столбцов, которые не отображаются в вашей маске логического фрейма данных, они становятся NaN по умолчанию.

      import pandas as pd
df = pd.DataFrame({'a': [1, 2, np.NaN, 4],
                   'b': [10, 11, 12, 13]})

# Boolean Series, return all columns only for for rows where condition is True
df[df['a'] == 2]
#     a   b
#1  2.0  11


# Boolean DataFrame, equivalent to df.where(df[['a']] == 2)
df[df[['a']] == 2]
#     a   b
#0  NaN NaN
#1  2.0 NaN
#2  NaN NaN
#3  NaN NaN

Итак, я нашел способ, при котором, получив фрейм данных True и False, я затем выполняю побитовую операцию, используя all или any. Вы можете обратиться к:

      override[override[['ORIGINAL_CREDITOR_ID']].notna().all(1)].shape

Это помогло бы мне фильтровать результаты, которые я хочу, и это намного быстрее, т.е. за 8 мс. Я нашел этот ответ здесь . Так что надеюсь, вы найдете это полезным. Дайте мне знать, если вам нужно больше понимания.

Другие вопросы по тегам