Функция Pandas df.filter()

Pandas: общие функции


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

Непосредственно укажите список имён столбцов, чтобы выбрать определённые столбцы.

Пример

import pandas as pd

# Создать пример 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

Пояснение к коду:

  1. filter(items=['name', 'age'])Выбирает указанные столбцы и возвращает новый DataFrame, содержащий эти столбцы.
  2. Все строки сохраняются; выбираются только определённые столбцы.
  3. Если указанное имя столбца не существует, возникает исключение KeyError.

Пример 2: Использование параметра like - нечёткое сопоставление

likeПараметр `like` позволяет фильтровать столбцы, имена которых содержат указанную строку. Это очень удобно для наборов данных с однотипными именами столбцов.

Пример

import pandas as pd

# Создать 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 — сопоставление с регулярным выражением

Для более сложных задач фильтрации по именам столбцов можно использовать регулярные выражения.

Пример

import pandas as pd

# Создать сложные имена столбцов
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

Пояснение к коду:

  1. filter(regex='^score_')Используйте^чтобы сопоставить столбцы, начинающиеся с "score_".
  2. filter(regex='\d')Используйте\dчтобы сопоставить имена столбцов, содержащие цифры.
  3. Регулярные выражения обеспечивают наибольшую гибкость и могут обрабатывать различные сложные задачи сопоставления.

Пример 4: Использование параметра axis для фильтрации строк

Хотяfilter()в основном используется для столбцов, черезaxisпараметр, его также можно использовать для фильтрации строк.

Пример

import pandas as pd

# Создание 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 pandas as pd
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 она может значительно повысить эффективность обработки данных и читаемость кода.

Pandas: общие функции

Другие расширения