Страницы

Поиск по вопросам

воскресенье, 29 марта 2020 г.

Особенности использования условий в DataFrame

#python #pandas #dataframe #условия


Есть DataFrame, в котором надо заполнить col3 данными из col2 по условию:

mask = ((df['col3'].isnull()) & (df['col1'] == 2))


 col1   col2    col3
0   2   2   NaN
1   3   1   NaN
2   2   1   NaN
3   3   1   NaN
4   2   2   NaN


Вывожу данные, которые должны быть изменены в col3:

mask = ((df['col3'].isnull()) & (df['col1'] == 2))
df.loc[mask]

 col1   col2 col3
0   2   2   NaN
2   2   1   NaN
4   2   2   NaN


Выполняю заполнение:

df.loc[mask, 'col3'] = df['col2']
df


Проверяю результат:

df
 col1   col2 col3
0   2   2   2.0
1   3   1   NaN
2   2   1   1.0
3   3   1   NaN
4   2   2   2.0


Все ОК, но на большом объеме данных так не проверишь.

Повторно использую для этого маску:

df.loc[mask]

 col1 col2  col3
0   2   2   2.0
2   2   1   1.0
4   2   2   2.0


Ожидал, что будет пустой список, т.к. col3 заполнена данными, а в маске существует
условие df['col3'].isnull() - выводить только незаполненные.

Почему так произошло и в чем я ошибся?
    


Ответы

Ответ 1



Логическая ошибка в том, что переменная mask была создана до заполнения col3. In [12]: df Out[12]: col1 col2 col3 0 2 2 2.0 1 3 1 NaN 2 2 1 1.0 3 3 1 NaN 4 2 2 2.0 Создаем логическую маску после обновления: In [13]: mask = ((df['col3'].isna()) & (df['col1'] == 2)) и получаем пустой DataFrame: In [14]: df.loc[mask] Out[14]: Empty DataFrame Columns: [col1, col2, col3] Index: [] PS методы .isnull() / .notnull() являются устаревшими, лучше использовать .isna() / .notna().

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

Отправить комментарий