В чем разница между 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 мс. Я нашел этот ответ здесь . Так что надеюсь, вы найдете это полезным. Дайте мне знать, если вам нужно больше понимания.