Метод filter
Метод filter применяется к объекту DataFrameGroupBy, полученному после группировки, и позволяет отфильтровать группы строк в соответствии с заданным условием. В результате возвращается новый DataFrame, содержащий только те строки из исходной таблицы, которые принадлежат группам, удовлетворяющим условию фильтрации. В качестве первого параметра метод принимает функцию фильтрации, которая должна вернуть булево значение (истину или ложь) для каждой группы. Метод также содержит параметры для более гибкой настройки фильтрации.
Синтаксис
groupby_object.filter(func, dropna=True)
Пример
Пусть у нас есть таблица с данными о продажах в двух городах. Отфильтруем группы, оставив только те города, где сумма продаж превышает определенное значение:
import pandas as pd
df = pd.DataFrame({
'city': ['A', 'B', 'A', 'B', 'A'],
'sales': [100, 150, 200, 50, 300]
})
grouped = df.groupby('city')
res = grouped.filter(lambda x: x['sales'].sum() > 250)
print(res)
Результат выполнения кода:
city sales
0 A 100
2 A 200
4 A 300
Пример
Отфильтруем группы, где количество строк в группе больше одного:
import pandas as pd
df = pd.DataFrame({
'city': ['A', 'B', 'A', 'B', 'C'],
'sales': [100, 150, 200, 50, 300]
})
grouped = df.groupby('city')
res = grouped.filter(lambda x: len(x) > 1)
print(res)
Результат выполнения кода:
city sales
0 A 100
1 B 150
2 A 200
3 B 50
Пример
Отфильтруем группы, исключив группы с пропущенными значениями в столбце 'sales'. Для этого воспользуемся параметром dropna со значением False, чтобы оставить группы, содержащие пропуски:
import pandas as pd
import numpy as np
df = pd.DataFrame({
'city': ['A', 'B', 'A', 'B', 'A'],
'sales': [100, np.nan, 200, 50, 300]
})
grouped = df.groupby('city')
res = grouped.filter(lambda x: x['sales'].mean() > 100, dropna=False)
print(res)
Результат выполнения кода:
city sales
0 A 100.0
2 A 200.0
4 A 300.0
Пример
Используем более сложное условие фильтрации: отберем группы, где максимальное значение в столбце 'sales' больше 250 и минимальное значение больше 50:
import pandas as pd
df = pd.DataFrame({
'city': ['A', 'B', 'A', 'B', 'A'],
'sales': [100, 150, 300, 60, 250]
})
grouped = df.groupby('city')
res = grouped.filter(
lambda x: x['sales'].max() > 250 and x['sales'].min() > 50
)
print(res)
Результат выполнения кода:
city sales
0 A 100
2 A 300
4 A 250