#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().
Комментариев нет:
Отправить комментарий