Эффективные приёмы отбора значений в DataFrame
Поиск данных в таблицах - одна из самых частых задач при работе с 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.
Цель: выбор подмножества столбцов для анализа. Удобно, когда столбцы имеют общий префикс/суффикс.
Расширенный пример 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.