Эффективные способы работы с pandas в Python
Библиотека pandas предоставляет удобные структуры данных и инструменты для анализа табличных данных. В этой статье рассматриваются основные приёмы работы с DataFrame, включая загрузку, фильтрацию, обработку пропусков, группировку и объединение данных. Все примеры сопровождаются кодом и пояснениями.
Основные возможности pandas
Векторизованные операции
Наиболее эффективный способ работы с pandas – использование встроенных векторизованных методов, которые обрабатывают данные быстрее циклов. Например, для вычисления новой колонки на основе существующих применяется прямое присваивание:
import pandas as pd
df = pd.DataFrame({'a': [1,2,3], 'b': [4,5,6]})
df['c'] = df['a'] + df['b'] # векторизованное сложениеPython для анализа данных (python для анализа данных)
Такой подход выполняется на C-уровне и оптимизирован по скорости. Аналогично для фильтрации, агрегации, замены значений.
Как загрузить данные из CSV в DataFrame?
Основной вариант: pd.read_csv
df = pd.read_csv('data.csv', sep=',', encoding='utf-8')анализ больших данных python (анализ больших данных в python)
Что делать, если файл имеет другую кодировку или разделитель?
Можно указать параметры encoding (например, 'cp1251') и sep (например, ';'). Если файл большой, добавить chunksize для чтения по частям.
Типичные ошибки
- UnicodeDecodeError – неправильная кодировка. Решение: перебрать популярные кодировки или указать engine='python'.
- ParserError – неверный разделитель или лишние кавычки. Решение: указать quotechar или skipinitialspace.
Как отфильтровать строки по условию?
Основной способ: логическая индексация через .loc
filtered = df.loc[df['column'] > 10]
Python анализ данных excel (анализ данных excel в python)
Этот метод возвращает копию данных и не вызывает SettingWithCopyWarning при дальнейших изменениях.
Какие ещё варианты фильтрации существуют?
- df.query('column > 10') – удобен для сложных строковых условий.
- df[df['column'].isin([1,2])] – фильтрация по списку значений.
- df.filter(items=['col1','col2']) – фильтрация по именам столбцов.
Проблема SettingWithCopyWarning
Возникает, когда после фильтрации пытаются изменить часть DataFrame. Рекомендуется всегда использовать .loc или .copy() для явного создания копии.
# Опасно: может вызвать warning
df_filtered = df[df['a'] > 0]
df_filtered['b'] = 0
# Правильно
df_filtered = df.loc[df['a'] > 0].copy()
df_filtered['b'] = 0анализ данных python pdf (анализ данных pdf в python)
Как обработать пропущенные значения?
Основные стратегии: удаление или заполнение
Для удаления строк с NaN используется df.dropna(). Для заполнения – df.fillna(value). Обычно предпочтительнее заполнение, чтобы не терять данные.
# Заполнить пропуски нулём
df['col'] = df['col'].fillna(0)
# Заполнить средним
df['col'] = df['col'].fillna(df['col'].mean())Python анализ данных и машинное обучение (анализ данных и машинное обучение на python)
Какие есть продвинутые методы заполнения?
- ffill() – перенос предыдущего значения вперёд.
- bfill() – перенос следующего значения назад.
- interpolate() – линейная интерполяция для числовых рядов.
Ошибка: изменение среза вместо оригинала
При использовании inplace=True может возникнуть путаница. Рекомендуется не использовать inplace, а присваивать результат новой переменной или той же.
Как сгруппировать данные и вычислить статистики?
Основной подход: groupby + agg
df.groupby('category')['value'].agg(['mean', 'sum', 'count'])анализ данных с использованием python (анализ данных с использованием python)
Метод agg позволяет применить несколько функций к одной колонке или разные функции к разным колонкам.
Что делать, если нужна нестандартная функция?
Можно использовать .apply() внутри groupby, но это медленнее. Более эффективно – создать собственную векторизованную функцию и передать её в agg.
def iqr(x):
return x.quantile(0.75) - x.quantile(0.25)
df.groupby('cat')['val'].agg(iqr)Python анализ текстовых данных (анализ текстовых данных в python)
Потеря индекса после groupby
По умолчанию ключи группировки становятся индексом. Чтобы сохранить их как колонки, используйте as_index=False в groupby или .reset_index() после.
Как объединить два DataFrame по общему столбцу?
Основной вариант: pd.merge
merged = pd.merge(df1, df2, on='key', how='inner')аналитик данных python sql (аналитик данных python sql)
Параметр how задаёт тип соединения: inner, left, right, outer.
Когда использовать concat вместо merge?
pd.concat удобен для объединения таблиц с одинаковыми колонками (склеивание по строкам) или одинаковыми индексами (по столбцам).
# Склеить по строкам
df_stack = pd.concat([df_a, df_b], ignore_index=True)
# Склеить по столбцам
df_wide = pd.concat([df_x, df_y], axis=1)Конфликт имён столбцов при merge
Если объединяемые таблицы содержат одноимённые столбцы (кроме ключа), pandas добавляет суффиксы _x, _y. Это можно контролировать через параметр suffixes.
Подробные примеры
import pandas as pd
import numpy as np
# 1. Чтение с разными параметрами
# CSV с разделителем табуляции, кодировка cp1251, чтение только первых 1000 строк
df = pd.read_csv('sales.tsv', sep='\t', encoding='cp1251', nrows=1000)
# Явное указание типов для экономии памяти
df = pd.read_csv('data.csv', dtype={'col1': 'int32', 'col2': 'float32'})
# Парсинг дат
df = pd.read_csv('dates.csv', parse_dates=['date_column'])
# 2. Фильтрация с несколькими условиями
df_filtered = df[(df['age'] > 18) & (df['city'] == 'Moscow')]
# Использование query
df_filtered = df.query('age > 18 and city == "Moscow"')
# Фильтрация по строковому шаблону (регулярка)
df_filtered = df[df['email'].str.contains('@gmail\.com', na=False)]
# 3. Обработка пропусков
# Заполнение forward fill по группе
df['value'] = df.groupby('id')['value'].transform(lambda x: x.ffill())
# Интерполяция временного ряда
df['temp'] = df['temp'].interpolate(method='time', limit_direction='both')
# Удаление строк, где более 50% пропусков
df_clean = df.dropna(thresh=len(df.columns)*0.5, axis=0)
# 4. Группировка с разными аггрегациями
grouped = df.groupby(['region', 'year']).agg(
avg_sales=('sales', 'mean'),
max_sales=('sales', 'max'),
count=('sales', 'count'),
first_date=('date', 'first')
).reset_index()
# 5. Слияние с разными типами соединений и суффиксами
orders = pd.DataFrame({'id': [1,2,3], 'cust': ['A','B','C']})
payments = pd.DataFrame({'id': [1,2,4], 'amount': [100, 200, 300]})
# Левое соединение с пользовательскими суффиксами
merged = pd.merge(orders, payments, on='id', how='left', suffixes=('_order', '_pay'))
# 6. Pivot и melt
# Исходная таблица: sales (id, month, revenue)
pivot = df.pivot_table(index='id', columns='month', values='revenue', aggfunc='sum', margins=True)
# Обратный процесс - melt
df_long = pd.melt(pivot, id_vars=['id'], value_vars=['Jan','Feb'], var_name='month', value_name='revenue')
# Вывод для примера 4 (гипотетический) region year avg_sales max_sales count first_date 0 North 2020 150.5 200 3 2020-01-15 1 South 2020 180.0 250 2 2020-02-20 ...