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

