Как удалить строки содержащие NaN в одном столбце и заданное значение в другом?
Имеется фрейм данных:
import pandas as pd
import numpy as np
data = {'фрукт': ['груша','арбуз','банан','груша', 'груша', 'вишня', 'груша', 'вишня', 'абрикос', 'груша', 'груша'],
'страна': ['сша', 'россия', 'россия', np.nan, np.nan,'россия', 'франция', 'португалия', 'россия', np.nan, np.nan],
'id': ['01','01','011', '011', '011', '011', '6', '6', '5', '5', '5'],
'месяц': ['июнь','январь','январь', 'январь', 'май', 'январь', 'январь', 'январь', 'январь', 'сентябрь', 'январь']
}
dates = pd.DataFrame(data, columns = ['фрукт','страна', 'id', 'месяц'])
Нужно удалить строки, которые одновременно не содержат страну и месяц не январь
Как можно это сделать?
Ожидаемый результат:
Ответы (2 шт):
Автор решения: MaxU
→ Ссылка
res = df.drop(df.query("страна != страна and месяц != 'январь'").index)
или:
res = df.query("страна == страна or месяц == 'январь'")
результат:
In [62]: res
Out[62]:
фрукт страна id месяц
0 груша сша 01 июнь
1 арбуз россия 01 январь
2 банан россия 011 январь
3 груша NaN 011 январь
5 вишня россия 011 январь
6 груша франция 6 январь
7 вишня португалия 6 январь
8 абрикос россия 5 январь
10 груша NaN 5 январь
PS для фильтрации NaN можно использовать тот факт, что NaN != NaN (т.е. NaN не равен самому себе):
In [65]: np.nan == np.nan
Out[65]: False
Автор решения: CrazyElf
→ Ссылка
Ну вот так можно выбрать то, что оставить (инвертированы оба условия и и превратилось в или):
dates.loc[~dates.страна.isna() | (dates.месяц == 'январь')]

