Одной из ключевых задач при работе с данными является фильтрация на основе определенных условий или критериев. Pandas предоставляет богатые возможности для фильтрации данных в Series.
Прежде всего для фильтрации данных мы можем использовать такие операторы сравнения, как >, >, <=, >=, == и !=. Эти операторы позволяют создать
логические маски, которые указывают, удовлетворяет ли каждый элемент в Series указанному условию. Рассмотрим несколько примеров:
import pandas as pd s = pd.Series([10, 20, 30, 40, 50]) # Фильтрация данных, превышающих 30 filtered_data = s[s > 30] print(filtered_data)
Вывод программы:
3 40 4 50 dtype: int64
Здесь, используя оператор сравнения <, мы создаем логическую маску, которая проверяет, превышает ли каждый элемент значение 30. Применение этой маски к Series (s > 30)
возвращает отфильтрованные данные, которые удовлетворяют условию.
Другой пример:
import pandas as pd s = pd.Series(["Tom", "Bob", "Sam", "Tom", "Alex", "Alice"]) # Фильтрация элементов, которые равны "Tom" filtered_data = s[s == "Tom"] print(filtered_data)
Вывод программы:
0 Tom 3 Tom dtype: object
Здесь с помощью оператора сравнения == создаем логическую маску, которая проверяет, равен ли каждый элемент значению "Tom". Применение этой маски (s == "Tom") фильтрует Series,
сохраняя только те элементы, которые соответствуют указанному значению.
Аналогично можно использовать другие операторы сравнения.
Логические операторы, (& и |) позволяют объединить нескольких условий. Как и в целом в Python, оператор & указывает, что элементы должны
соответствовать сразу двум условиям. Например, нам надо отфильтровать элементы, которые одновременно больше 8 и меньше 20:
import pandas as pd s = pd.Series([1, 2, 3, 5, 8, 13, 21, 34, 55, 89]) # Фильтрация значений больше 8 И меньше 30 filtered_data = s[(s > 8) & (s < 30)] print(filtered_data)
Вывод программы:
8 5 13 6 21 dtype: int64
Здесь объединяем два условия: (s > 8) & (s < 30). Эти условия создают две отдельные логические маски. Первая маска проверяет, больше ли каждый элемент 8, а вторая маска
проверяет, меньше ли каждый элемент 30. Затем мы объединяем эти две маски с помощью логического оператора & внутри квадратных скобок: [(s > 8) & (s < 30)].
Логический оператор & оценивает условия для каждого элемента и возвращает логическую маску, которая указывает, какие элементы удовлетворяют одновременно обоим условиям.
Другой пример: если нам надо определить, соответствуют значения хотя бы одному из двух условий, то мы можем использовать оператор |:
import pandas as pd s = pd.Series([1, 2, 3, 5, 8, 13, 21, 34, 55, 89]) # Фильтрация значений меньше 8 ИЛИ больше 30 filtered_data = s[(s < 8) | (s > 30)] print(filtered_data)
Вывод программы:
0 1 1 2 2 3 3 5 7 34 8 55 9 89 dtype: int64
Здесь для фильтрации объединяем две маски с помощью логического оператора | в квадратных скобках: [(s < 8) | (s > 30)].
Логический оператор | оценивает условия для каждого элемента и возвращает логическую маску, которая указывает, какие элементы удовлетворяют как минимум одному из условий.
Также Pandas предоставляет ряд встроенных методов для фильтрации данных. Рассмотрим некоторые из них.
Метод isin() позволяет проверить, соответствуют ли элементы в Series каким-либо из указанных значений. Этот метод полезен, когда необходимо отфильтровать данные на основе нескольких значений. Например:
import pandas as pd s = pd.Series(["Tom", "Bob", "Sam", "Kate", "Alex", "Alice"]) # Фильтрация элементов, которые есть в ["Tom", "Rob", "Alice"] filtered_data = s[s.isin(["Tom", "Rob", "Alice"])] print(filtered_data)
Здесь метод isin() проверяет, присутствует ли каждый элемент в Series в списке значений ["Tom", "Rob", "Alice"]. В итоге мы получаем только те элементы, которые есть в этом списке.
0 Tom 5 Alice dtype: object
Еще один полезный метод - метод between() помогает отфильтровать данные, которые располагаются в определенном диапазоне. Например, у нас есть числовой ряд, и нам надо получить числа из диапазона от 8 до 30:
import pandas as pd s = pd.Series([1, 2, 3, 5, 8, 13, 21, 34, 55, 89]) # Фильтрация значений от 8 до 30 включая filtered_data = s[s.between(8, 30)] print(filtered_data)
Результат программы:
4 8 5 13 6 21 dtype: int64