Эффективные способы работы с pandas в Python

Раздел: Python -> Pandas и NumPy

Библиотека 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.

- математика и python для анализа данных (математика и python для анализа данных)
- методы анализа данных python (методы анализа данных в python)
- Python для анализа данных обучение (обучение анализу данных на python)

Подробные примеры

Пример
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
...

Работа с библиотекой pandas - comments

En
работа с pandas python (python)