Функция Pandas df.filter()
filter()является функцией в Pandas, используемой для фильтрации столбцов (а не строк). Она может выбирать определённые столбцы на основе имён столбцов, шаблонов меток или регулярных выражений. В отличие отloc[]иiloc[]других функций,filter()она специально предназначена для выбора столбцов, что очень полезно при работе с наборами данных с большим количеством столбцов.
При анализе данных иногда нужно сосредоточиться только на определённых столбцах, например, выбор только числовых столбцов, только столбцов, начинающихся с определённого префикса, или только столбцов, содержащих определённое ключевое слово.filter()Это предназначено для таких сценариев.
Базовый синтаксис и параметры
filter()является методом DataFrame и Series (для Series поддерживается только параметр items), используется для фильтрации столбцов по условиям.
Формат синтаксиса
DataFrame.filter(items=None, like=None, regex=None, axis=None)
Описание параметра
| Параметр | Type | Обязательный | Описание | Значение по умолчанию |
|---|---|---|---|---|
| items | list | Optional | Напрямую укажите список имён столбцов для выбора соответствующих столбцов. | Отсутствует |
| например | str | Optional | Имена столбцов, содержащие указанную строку; поддерживается нечёткое сопоставление. | Отсутствует |
| regex | str | Optional | Шаблон регулярного выражения для сопоставления имён столбцов. | Отсутствует |
| axis | int или str | Optional | Ось для фильтрации. 0 или 'index' означает строки, 1 или 'columns' означает столбцы. | 1 или 'columns' |
Описание возвращаемого значения
- Тип возвращаемого значения: Возвращает новый DataFrame, содержащий отфильтрованные столбцы.
- Фильтрация столбцов: По умолчанию,
filter()она действует на столбцы (axis=1). - Все строки сохраняются: Фильтрация влияет только на столбцы; данные строк остаются неизменными.
Примеры
Давайте полностью освоим использованиеfilter()его на множестве примеров.
Пример 1: Базовое использование — использование параметра items
Непосредственно укажите список имён столбцов, чтобы выбрать определённые столбцы.
Пример
# Создать пример DataFrame
data = {
'name': ['Алиса', 'Боб', 'Чарли', 'Дэвид', 'Ева'],
'age': [18, 19, 17, 18, 20],
'score': [85, 92, 78, 90, 88],
'grade': ['A', 'A', 'B', 'A', 'B'],
'city': ['Пекин', 'Шанхай', 'Пекин', 'Гуанчжоу', 'Шанхай']
}
df = pd.DataFrame(data)
print("Исходный DataFrame:")
print(df)
print()
# Используйте параметр items для выбора определённых столбцов
print("Выберите столбцы name и age:")
print(df.filter(items=['name', 'age']))
print()
# Выберите один столбец (возвращает DataFrame)
print("Выберите только столбец score:")
print(df.filter(items=['score']))
Вывод:
原始 DataFrame:
name age score grade city
0 Alice 18 85 A Beijing
1 Bob 19 92 A Shanghai
2 Charlie 17 78 B Beijing
3 David 18 90 A Guangzhou
4 Eve 20 88 B Shanghai
选择 name 和 age 列:
name age
0 Alice 18
1 Bob 19
2 Charlie 17
3 David 18
4 Eve 20
只选择 score 列:
score
0 85
1 92
2 78
3 90
4 88
Пояснение к коду:
filter(items=['name', 'age'])Выбирает указанные столбцы и возвращает новый DataFrame, содержащий эти столбцы.- Все строки сохраняются; выбираются только определённые столбцы.
- Если указанное имя столбца не существует, возникает исключение KeyError.
Пример 2: Использование параметра like - нечёткое сопоставление
likeПараметр `like` позволяет фильтровать столбцы, имена которых содержат указанную строку. Это очень удобно для наборов данных с однотипными именами столбцов.
Пример
# Создать DataFrame с однотипными именами столбцов
data = {
'name': ['Алиса', 'Боб', 'Чарли', 'Дэвид', 'Ева'],
'age_2020': [18, 19, 17, 18, 20],
'age_2021': [19, 20, 18, 19, 21],
'age_2022': [20, 21, 19, 20, 22],
'score_2020': [85, 92, 78, 90, 88],
'score_2021': [87, 94, 80, 92, 90],
'score_2022': [89, 96, 82, 94, 92],
'city': ['Пекин', 'Шанхай', 'Пекин', 'Гуанчжоу', 'Шанхай']
}
df = pd.DataFrame(data)
print("Исходный DataFrame:")
print(df)
print()
# Выбрать все столбцы, содержащие "age"
print("Столбцы, содержащие 'age':")
print(df.filter(like='age'))
print()
# Выбрать все столбцы, содержащие "score"
print("Столбцы, содержащие 'score':")
print(df.filter(like='score'))
print()
# Выбрать все столбцы, содержащие "2021"
print("Столбцы, содержащие '2021':")
print(df.filter(like='2021'))
Вывод:
原始 DataFrame:
name age_2020 age_2021 age_2022 score_2020 score_2021 score_2022 city
0 Alice 18 19 20 85 87 89 Beijing
1 Bob 19 20 21 92 94 96 Shanghai
2 Charlie 17 18 19 78 80 82 Beijing
3 David 18 19 20 90 92 94 Guangzhou
4 Eve 20 21 22 88 90 92 Shanghai
包含 'age' 的列:
age_2020 age_2021 age_2022
0 18 19 20
1 19 20 21
2 17 18 19
3 18 19 20
4 20 21 22
包含 'score' 的列:
score_2020 score_2021 score_2022
0 85 87 89
1 92 94 96
2 78 80 82
3 90 92 94
4 88 90 92
包含 '2021' 的列:
age_2021 score_2021
0 19 87
1 20 94
2 18 80
3 19 92
4 21 90
Пояснение к коду:
filter(like='age')Выбирает все столбцы, имена которых содержат "age".- Нечёткое сопоставление не требует знания полного имени столбца; достаточно указать частичную строку для сопоставления.
- Это особенно полезно при работе со столбцами, которые следуют схожим соглашениям об именовании (например, столбцы, организованные по годам).
Пример 3: Использование параметра regex — сопоставление с регулярным выражением
Для более сложных задач фильтрации по именам столбцов можно использовать регулярные выражения.
Пример
# Создать сложные имена столбцов
data = {
'id': [1, 2, 3, 4, 5],
'name': ['Алиса', 'Боб', 'Чарли', 'Дэвид', 'Ева'],
'age_2020': [18, 19, 17, 18, 20],
'age_2021': [19, 20, 18, 19, 21],
'score_math': [85, 92, 78, 90, 88],
'score_english': [87, 94, 80, 92, 90],
'score_science': [89, 96, 82, 94, 92],
'city': ['Пекин', 'Шанхай', 'Пекин', 'Гуанчжоу', 'Шанхай']
}
df = pd.DataFrame(data)
print("Столбцы исходного DataFrame:")
print(df.columns.tolist())
print()
# Выбрать столбцы, начинающиеся с "score_"
print("Столбцы, начинающиеся с 'score_':")
print(df.filter(regex='^score_'))
print()
# Выбрать имена столбцов, содержащие цифры
print("Имена столбцов, содержащие цифры:")
print(df.filter(regex='\d')) # \d соответствует цифрам
print()
# Выбрать столбцы, содержащие одновременно "age" и "202"
print("Столбцы, содержащие одновременно 'age' и '202':")
print(df.filter(regex='age.*202|202.*age'))
print()
# Выбрать столбцы, начинающиеся с буквы и не содержащие подчеркиваний
print("Столбцы, начинающиеся с буквы и без подчеркиваний:")
print(df.filter(regex='^[a-zA-Z]+$'))
Вывод:
原始 DataFrame 的列:
['id', 'name', 'age_2020', 'age_2021', 'score_math', 'score_english', 'score_science', 'city']
以 'score_' 开头的列:
score_math score_english score_science
0 85 87 89
1 92 94 96
2 78 80 82
3 90 92 94
4 88 90 92
包含数字的列名:
age_2020 age_2021 score_math score_english score_science
0 18 19 85 87 89
1 19 20 92 94 96
2 17 18 78 80 82
3 18 19 90 92 94
4 20 21 88 90 92
包含 'age' 和 '202' 的列:
age_2020 age_2021
0 18 19
1 19 20
2 17 18
3 18 19
4 20 21
以字母开头且不含下划线的列:
name city
0 Alice Beijing
1 Bob Shanghai
2 Charlie Beijing
3 David Guangzhou
4 Eve Shanghai
Пояснение к коду:
filter(regex='^score_')Используйте^чтобы сопоставить столбцы, начинающиеся с "score_".filter(regex='\d')Используйте\dчтобы сопоставить имена столбцов, содержащие цифры.- Регулярные выражения обеспечивают наибольшую гибкость и могут обрабатывать различные сложные задачи сопоставления.
Пример 4: Использование параметра axis для фильтрации строк
Хотяfilter()в основном используется для столбцов, черезaxisпараметр, его также можно использовать для фильтрации строк.
Пример
# Создание DataFrame с именованным индексом
data = {
'name': ['Алиса', 'Боб', 'Чарли', 'Дэвид', 'Ева'],
'age': [18, 19, 17, 18, 20],
'score': [85, 92, 78, 90, 88]
}
df = pd.DataFrame(data, index=['row1', 'row2', 'row3', 'row4', 'row5'])
print("DataFrame с именованным индексом:")
print(df)
print()
# Используйте axis='index' для фильтрации строк (с помощью like)
print("Строки, индекс которых содержит 'row':")
print(df.filter(like='row', axis='index'))
print()
# Используйте items для фильтрации строк с конкретными индексами
print("Строки с индексом 'row1' и 'row3':")
print(df.filter(items=['row1', 'row3'], axis='index'))
print()
# Использовать регулярное выражение для фильтрации строк
print("Строки, чей индекс соответствует регулярному выражению (row)
print(df.filter(regex='row[135]', axis='index'))
Вывод:
带命名索引的 DataFrame:
name age score
row1 Alice 18 85
row2 Bob 19 92
row3 Charlie 17 78
row4 David 18 90
row5 Eve 20 88
索引包含 'row' 的行:
name age score
row1 Alice 18 85
row2 Bob 19 92
row3 Charlie 17 78
row4 David 18 90
row5 Eve 20 88
索引为 'row1' 和 'row3' 的行:
name age score
row1 Alice 18 85
row3 Charlie 17 78
索引匹配正则表达式(row[135])的行:
name age score
row1 Alice 18 85
row3 Charlie 17 78
row5 Eve 20 88
Пояснение к коду:
axis='index'илиaxis=0Указываетfilter()df.filter() фильтровать индексы строк.like、items、regexПараметры используются одинаково при фильтрации строк, как и при фильтрации столбцов.- Это очень полезно, когда нужно фильтровать конкретные строки на основе имен индексов.
Пример 5: Комбинирование с другими функциями
filter()Его можно комбинировать с другими функциями Pandas для достижения мощных возможностей выбора данных.
Пример
import numpy as np
# Создать большой DataFrame
np.random.seed(42)
df = pd.DataFrame(np.random.randn(5, 10), columns=[
'A', 'B', 'C', 'D', 'E',
'AA', 'BB', 'CC', 'DD', 'EE'
])
print("Столбцы исходного DataFrame:")
print(df.columns.tolist())
print()
# Отфильтровать столбцы с одиночными буквами и выполнить вычисление
single_letter_cols = df.filter(regex='^[A-E]$')
print("Среднее для столбцов с одиночными буквами (A-E):")
print(single_letter_cols.mean())
print()
# Отфильтровать столбцы с двойными буквами и выполнить вычисление
double_letter_cols = df.filter(regex='^[A-E]{2}$')
print("Среднее для столбцов с двойными буквами (AA-EE):")
print(double_letter_cols.mean())
print()
# Сначала отфильтровать столбцы, затем выбрать строки
print("Первые 3 строки столбцов с двойными буквами:")
print(df.filter(regex='^[A-E]{2}$').head(3))
Вывод:
原始 DataFrame 的列:
['A', 'B', 'C', 'D', 'E', 'AA', 'BB', 'CC', 'DD', 'EE']
单字母列(A-E)的均值:
A 0.336744
B 0.128223
C -0.234007
D -0.347540
E -0.197939
dtype: float64
双字母列(AA-EE)的均值:
AA 0.530256
BB -0.671336
CC 0.506853
DD -0.443588
EE -0.456486
dtype: float64
双字母列的前 3 行:
AA BB CC DD EE
0 -0.013497 -1.174139 0.214864 1.550698 0.375698
1 -1.368593 0.746580 0.669383 -0.717552 -1.159950
2 0.602619 -1.700736 -0.201647 -0.605166 -0.012750
Пояснение к коду:
filter()Его можно объединять в цепочку с другими методами DataFrame.- Сначала отфильтруйте определённые столбцы, затем выполните статистические вычисления, что повышает читаемость кода.
- Это особенно полезно при обработке широких таблиц.
Примечания
items`items` используется для точного указания имён столбцов, `like` — для нечёткого сопоставления, а `regex` — для сопоставления по регулярному выражению. Выбирайте подходящий метод в соответствии с фактическими потребностями.likeПри обработке больших наборов данных сначала используйтеregexдля фильтрации нужных столбцов, что позволяет уменьшить объём данных для последующих вычислений и повысить производительность.- По умолчанию он действует по столбцам (axis=1) и может использоваться для
filter()изменения направления фильтрации. filter()Примечаниеaxis='index'илиaxis=0Эти три параметра являются взаимоисключающими, и их нельзя использовать одновременно.- Совет:
items、like、regexЭто мощный инструмент для обработки широких таблиц (наборов данных с большим количеством столбцов). Особенно на этапе исследования данных, если вы хотите сосредоточиться только на определённом типе информации (например, на всех числовых столбцах, всех столбцах с определённым префиксом), использование
его позволяет быстро выполнить фильтрацию столбцов.
filter()Итогfilter()Столбцы можно быстро отфильтровать.
Итог
filter()Это функция в Pandas, специально предназначенная для фильтрации столбцов (и строк). Она предоставляет три метода фильтрации: точное указание (items), нечёткое совпадение (like) и сопоставление с регулярным выражением (regex).
Основные сценарии применения этой функции включают: фильтрацию определённых столбцов, обработку столбцов с регулярными соглашениями об именовании и динамический выбор столбцов для анализа. При использовании в сочетании с другими функциями Pandas она может значительно повысить эффективность обработки данных и читаемость кода.
Другие расширения