Мне нравится использовать маски bool для такого рода задач в пандах, потому что я думаю, что их легко читать, но есть и другие способы сделать это.
Что такое маска bool?
Маска bool - это, по сути, Series
значений True / False, применяемых к DataFrame
для ее фильтрации.
Шаг 1: создайте Series
значений True / False.
tag_3_is_nan = df['tag3'].isna()
tag_4_is_nan = df['tag4'].isna()
Шаг 2: примените их к DataFrame
df[bool_mask]
В вашем случае это будет применяться с использованием следующей логики.
Случай 1: Если элементы в tag_3 и tag_4 имеют значение «NaN», то возвращают промежуточный df со следующими столбцами: tag_0, tag_1 & tag_2.
df[tag_3_is_nan & tag_4_is_nan][['tag_0', 'tag_1', 'tag_2']]
Случай 2: Если элементы в tag_4 только 'NaN', тогда возвращают еще один промежуточный df со следующими столбцами: tag_0, tag_2, tag_3.
df[tag_4_is_nan & ~tag_3_is_nan][['tag_0', 'tag_2', 'tag_3']]
~
равно not
- поэтому ~tag_3_is_nan
означает, что tag_3 - это не nan.
Случай 3: Наконец, если ВСЕ столбцы имеют значения, отличные от NaN, вернуть промежуточный df со следующими столбцами: tag_0, tag_3, tag_4.
Удалять все строки, которые содержат хотя бы одно значение NaN, в пандах просто - просто используйте метод dropna()
df.dropna()[['tag_0', 'tag_3', 'tag_4']]
- Чтобы избежать
settingWithCopyWarning
вниз по строке, вы должны скопировать отфильтрованный df
.
Выше используется None
, но ваш пример использует 'NaN'
в качестве string
. Вы можете использовать тот же метод, если ваши данные содержат строки 'NaN'
, а не фактические None
.
tag_3_is_nan_string = df['tag3'] == 'NaN'