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