Эффективные приёмы отбора значений в DataFrame

Раздел: Работа с данными -> Pandas

Поиск данных в таблицах - одна из самых частых задач при работе с Pandas. В этой статье рассматриваются основные способы фильтрации и отбора строк и столбцов с примерами кода.

Основные методы поиска данных

Как эффективно отфильтровать строки по одному или нескольким условиям?

Наиболее эффективное решение - использование булевой индексации с методом .loc. Этот подход позволяет одновременно выбирать строки и столбцы по логическому условию. В отличие от цепочек df[df['col']>0], .loc работает напрямую с копией или представлением без предупреждений о цепочках присваивания.


import pandas as pd
df = pd.DataFrame({'Name':['Anna','Bob','Cathy','David'],'Age':[23,35,19,42],'Salary':[50000,60000,45000,70000]})
result = df.loc[df['Age'] > 30]
print(result)

обработка больших данных python (обработка больших данных в python)

    Name  Age  Salary
1    Bob   35   60000
3  David   42   70000

очистка данных python (очистка данных в python)

Пояснение:

Внутри .loc передается булев массив той же длины, что и DataFrame. Истинные строки остаются, ложные отбрасываются. Можно комбинировать условия через & (и), | (или), ~ (не).

Типичные ошибки и проблемы:

  • Использование or и and вместо | и & приводит к ошибке неоднозначности.
  • Забытые скобки вокруг отдельных условий: df.loc[(df['Age']>30) & (df['Salary']<60000)] - обязательны.
  • Работа с пропущенными значениями: при сравнении с NaN условие ложно для всех строк, следует использовать .isna().

Цель: отбор строк по произвольному логическому условию. Используется, когда требуется гибкая фильтрация с возможностью выбора столбцов.

Как выполнить сложную фильтрацию в одну строку, используя строковое выражение?

Метод .query() позволяет писать условия в виде строки, что делает код более читаемым, особенно при многих условиях. Также .query часто работает быстрее на больших наборах данных, так как использует numexpr.


result = df.query('Age > 30 and Salary > 50000')
print(result)

Python подготовка данных (подготовка данных в python)

    Name  Age  Salary
1    Bob   35   60000
3  David   42   70000

работа с dataframe python (работа с dataframe в python)

Пояснение:

В строке запроса используются названия столбцов напрямую. Для AND пишем and, для OR - or. Можно ссылаться на внешние переменные с помощью @.

  • Имена столбцов не должны содержать пробелов или спецсимволов, иначе их нужно заключать в обратные кавычки.
  • При использовании query с несуществующими столбцами возникает UndefinedVariableError.
  • Для строковых сравнений в query нельзя напрямую использовать .str.contains; требуется другой подход.

Цель: компактная запись сложных фильтров. Подходит для интерактивной работы и скриптов, где важна читаемость.

Как найти строки, где значение колонки входит в заданный список?

Метод .isin() проверяет принадлежность каждого элемента списку значений. Результат - булев массив, который можно использовать в .loc.


names_to_find = ['Bob', 'David']
result = df.loc[df['Name'].isin(names_to_find)]
print(result)

Python работа с большими данными (работа с большими данными в python)

    Name  Age  Salary
1    Bob   35   60000
3  David   42   70000

структурированные данные python (структурированные данные в python)

Пояснение:

.isin() принимает итерируемый объект (список, множество, Series). Возвращает True для строк, где значение столбца совпадает с любым элементом списка.

  • Метод чувствителен к типу данных: '123' и 123 считаются разными.
  • При наличии NaN в столбце они не будут найдены по умолчанию, если NaN нет в списке.
  • Для проверки по нескольким столбцам (например, кортеж значений) нужно использовать .isin с мультииндексом.

Цель: фильтрация по множеству допустимых значений. Полезно для отбора записей по id, категориям и т.д.

Как найти строки по частичному совпадению строкового значения?

Метод str.contains() позволяет проверять, содержит ли строка подстроку или шаблон регулярного выражения.


result = df.loc[df['Name'].str.contains('a', case=False)]
print(result)

генерация данных python (генерация данных в python)

    Name  Age  Salary
0   Anna   23   50000
3  David   42   70000

Python код символа (код символа в python)

Пояснение:

Параметр case=False делает поиск нечувствительным к регистру. По умолчанию na (обработка NaN) задается как False, что исключает пропуски из результата. Можно использовать регулярные выражения: df['Name'].str.contains('^(A|D)') - имена, начинающиеся на A или D.

  • Если столбец содержит NaN, .str.contains возвращает NaN для этих строк. Для безопасной фильтрации используют df['Name'].str.contains('a', na=False).
  • Регулярные выражения могут замедлить работу на больших данных.
  • Экранирование специальных символов выполняется через regex=False или с помощью re.escape.

Цель: поиск по тексту, когда точное совпадение не требуется. Применяется для фильтрации по ключевым словам, фрагментам названий.

Как отобрать столбцы по имени, используя шаблон?

Метод .filter() позволяет выбрать столбцы по их названиям с помощью точного совпадения, подстроки или регулярного выражения.


df2 = pd.DataFrame({'Name':['A'],'Age':[1],'Salary':[100],'Name_len':[3]})
result = df2.filter(like='Name')
print(result)

код из файла python (код из файла python)

   Name  Name_len
0     A         3

Пояснение:

Аргумент like ищет столбцы, содержащие подстроку. regex позволяет задать регулярное выражение. items - точное совпадение по списку.

  • .filter работает только с именами столбцов (или индексами), не с содержимым строк.
  • Не путать с .query или булевой индексацией - это разные задачи.
  • Если регулярное выражение неверное, возникает ошибка re.error.

Цель: выбор подмножества столбцов для анализа. Удобно, когда столбцы имеют общий префикс/суффикс.

- Python преобразование в строку (преобразование в строку в python)
- Python как проверить строку (проверка строки в python)
- как работать с данными в python (работа с данными в python)

Расширенный пример 1: поиск с регулярными выражениями и обработка пропусков

Пример

import pandas as pd
import numpy as np
df = pd.DataFrame({'City':['Moscow','Paris','London','New York',np.nan,'Berlin']})
mask = df['City'].str.contains(r'^[MP]', na=False, regex=True)
result = df.loc[mask]
print(result)
     City
0  Moscow
1   Paris
5  Berlin

Пояснение:

Регулярное выражение ^[MP] ищет города, начинающиеся с M или P. Параметр na=False гарантирует, что строки с пропущенными значениями не попадут в результат (иначе они превратились бы в NaN маску).

Расширенный пример 2: использование внешних переменных в query

Пример

min_age = 25
max_salary = 65000
result = df.query('Age >= @min_age and Salary <= @max_salary')
print(result)
    Name  Age  Salary
1    Bob   35   60000
3  David   42   70000

Пояснение:

Знак @ перед именем переменной указывает query, что это внешняя переменная, а не название столбца. Это позволяет динамически менять условия фильтра.

Расширенный пример 3: поиск по нескольким столбцам с isin (кортежи значений)

Пример

df_multi = pd.DataFrame({'Product':['A','B','C','A'],'Store':[1,2,1,2],'Sales':[100,200,150,180]})
pairs = [('A',1), ('C',1)]
mask = df_multi.set_index(['Product','Store']).index.isin(pairs)
result = df_multi[mask.values]
print(result)
  Product  Store  Sales
0       A      1    100
2       C      1    150

Пояснение:

Создается временный мультииндекс, затем проверяется принадлежность каждой комбинации кортежей. Возвращаются только строки с совпавшими парами.

Расширенный пример 4: отбор столбцов с помощью filter и regex

Пример

df_logs = pd.DataFrame({'log_date':['2025-01-01'],'log_time':['12:00'],'error_code':[404],'error_message':['Not Found'],'user_id':[123]})
selected = df_logs.filter(regex='^error_|^log_')
print(selected)
   log_date log_time  error_code error_message
0  2025-01-01     12:00         404   Not Found

Пояснение:

Регулярное выражение ^error_|^log_ выбирает все столбцы, начинающиеся с "error_" или "log_". Полезно для выделения групп однотипных столбцов.

Расширенный пример 5: замена значений неудовлетворяющих условию с помощью where

Пример

df_salary = pd.DataFrame({'Name':['Alisa','Bob','Cate'],'Salary':[40000,75000,52000]})
df_adjusted = df_salary['Salary'].where(df_salary['Salary'] >= 50000, other=50000)
print(df_adjusted)
0    50000
1    75000
2    52000
Name: Salary, dtype: int64

Пояснение:

.where оставляет значения, где условие истинно, иначе заменяет на other. Операция не изменяет исходный DataFrame, если не используется inplace=True.

Поиск данных в Python - comments

En
Data find python (python)