Pandas в анализе данных: полное руководство с примерами
Эффективный анализ данных с помощью Pandas
Библиотека pandas предоставляет мощные инструменты для загрузки, очистки, трансформации и анализа табличных данных. Наиболее эффективный способ начать анализ - использовать цепочку методов для быстрого получения статистик и базовой визуализации. Это позволяет минимизировать количество промежуточных переменных и повысить читаемость кода.
import pandas as pd
import numpy as np
# Загрузка данных из CSV (укажите свой путь)
df = pd.read_csv('sales_data.csv')
# Первичный обзор структуры
print(df.head())
print(df.info())
print(df.describe(include='all'))
# Группировка и агрегация за одну цепочку
result = (df
.groupby('category')
.agg({'revenue': 'sum', 'quantity': 'mean', 'profit': lambda x: x.quantile(0.75)})
.reset_index()
.rename(columns={'revenue': 'total_revenue', 'quantity': 'avg_quantity', 'profit': 'profit_75th'})
)
print(result)
# Быстрая визуализация (если установлен matplotlib)
result.plot.bar(x='category', y='total_revenue')
Python для анализа данных (python для анализа данных)
Пояснение: после загрузки данных метод info() показывает типы столбцов и количество непустых значений. describe() выводит основные статистики. Группировка с агрегацией нескольких метрик одновременно выполняется через groupby().agg(). Использование лямбда-функции позволяет вычислить любой пользовательский показатель (в примере - 75-й перцентиль).
Проблемы: если столбцы имеют некорректные типы (например, числа сохранены как строки), агрегация может не сработать или дать неверные результаты. Решение: перед группировкой следует преобразовать типы с помощью pd.to_numeric() или указать dtype при чтении файла. Также возможно появление NaN при отсутствии данных - их можно игнорировать с помощью dropna().
Как загрузить данные из CSV с указанием типов столбцов?
Нередко при чтении файла pandas автоматически определяет типы, но это может приводить к ошибкам (например, даты интерпретируются как строки). Лучше задать типы явно.
df = pd.read_csv('data.csv',
dtype={'order_id': 'int32', 'price': 'float32'},
parse_dates=['order_date'],
index_col='order_id')
анализ больших данных python (анализ больших данных в python)
Параметр parse_dates автоматически преобразует указанные столбцы в тип datetime64. index_col делает столбец индексом DataFrame. Это ускоряет последующие операции поиска.
Проблемы: если в CSV встречаются пропущенные значения в столбцах с явным типом, pandas может выдать ошибку или преобразовать их в NaN. Решение: использовать na_values для указания дополнительных символов пропусков и keep_default_na=False для отключения стандартных.
Цель: корректная загрузка данных с минимальными затратами памяти и временем.
Как отфильтровать строки по нескольким условиям?
Для фильтрации применяется логическая индексация. Условия объединяются операторами & (и) и | (или).
df_filtered = df[(df['age'] > 30) & (df['city'] == 'Moscow')]
# Или с помощью метода query (более читаемо для сложных выражений)
df_filtered = df.query('age > 30 and city == "Moscow"')
Python анализ данных excel (анализ данных excel в python)
Метод query принимает строку с условием, что удобно при динамическом формировании фильтра. Важно: в query названия столбцов не заключаются в кавычки, а строковые значения - в двойные кавычки (или одинарные, если внешняя строка в двойных).
Проблемы: при использовании логических операторов & и | необходимо заключать каждое условие в скобки, иначе возникает ошибка приоритета. Решение: всегда ставить скобки. В query можно использовать in для проверки принадлежности списку.
Цель: быстрое извлечение подмножества данных для дальнейшего анализа.
Как объединить несколько DataFrame по ключу?
Для объединения таблиц используется merge (аналог SQL JOIN) или concat для простого склеивания по строкам/столбцам.
df1 = pd.DataFrame({'id': [1,2,3], 'name': ['A','B','C']})
df2 = pd.DataFrame({'id': [2,3,4], 'score': [90,85,70]})
# Внутреннее соединение по id
merged = pd.merge(df1, df2, on='id', how='inner')
print(merged)
# Левое внешнее соединение
merged_left = pd.merge(df1, df2, on='id', how='left')
print(merged_left)
анализ данных python pdf (анализ данных pdf в python)
id name score 0 2 B 90 1 3 C 85 id name score 0 1 A NaN 1 2 B 90.0 2 3 C 85.0
Python анализ данных и машинное обучение (анализ данных и машинное обучение на python)
Параметр how определяет тип соединения: 'inner', 'left', 'right', 'outer'. Если ключи называются по-разному, используют left_on и right_on.
Проблемы: дублирование ключей может привести к декартову произведению. Решение: предварительно удалить дубликаты через drop_duplicates().
Цель: объединение разрозненных источников данных для целостного анализа.
Как обработать пропущенные значения?
Пропуски (NaN) могут мешать вычислениям. Основные стратегии: удаление строк/столбцов с пропусками или заполнение определённым значением.
# Удаление всех строк, где есть хоть один NaN
df_clean = df.dropna()
# Удаление столбцов, где более 50% пропусков
df_clean = df.dropna(thresh=len(df)*0.5, axis=1)
# Заполнение пропусков средним по столбцу
df_filled = df.fillna(df.mean())
# Заполнение вперед (ffill) - перенос предыдущего значения
df_ffill = df.fillna(method='ffill')
анализ данных с использованием python (анализ данных с использованием python)
Метод dropna() с параметром thresh позволяет гибко задавать минимальное количество не-NaN значений для сохранения. fillna() может принимать словарь {column: value} для разного заполнения.
Проблемы: заполнение средним искажает распределение, если пропуски не случайны. Решение: перед заполнением следует изучить природу пропусков (например, временной ряд заполнять интерполяцией). Использование method='ffill' может дать некорректные результаты при изменении тренда.
Цель: получение полного набора данных для корректных статистических расчётов.
Как создать сводную таблицу (pivot table)?
Сводная таблица обобщает данные по индексам и столбцам с агрегацией. Аналог Excel.
pivot = df.pivot_table(
values='revenue',
index='region',
columns='product',
aggfunc='sum',
fill_value=0
)
print(pivot)
Python анализ текстовых данных (анализ текстовых данных в python)
Параметр fill_value заменяет пропуски на указанное число (например, 0). aggfunc может быть списком для нескольких метрик.
product Laptop Tablet Phone region North 100 0 50 South 50 70 30
аналитик данных python sql (аналитик данных python sql)
Проблемы: если в данных есть дубликаты по комбинации index + columns, агрегация вызовет ошибку. Решение: предварительно агрегировать дубликаты через groupby или указать aggfunc=\'first\'.
Цель: компактное представление многомерных данных для выявления закономерностей.
Как применить пользовательскую функцию к столбцу?
Метод apply() позволяет применить любую функцию к каждому элементу (Series) или строке/столбцу (DataFrame).
def categorize_price(price):
if price < 50:
return 'low'
elif price < 150:
return 'medium'
else:
return 'high'
df['price_category'] = df['price'].apply(categorize_price)
# Аналог с map (только для Series с отображением)
df['price_category_map'] = df['price'].map(lambda x: 'low' if x < 50 else ('medium' if x < 150 else 'high'))
Python библиотеки numpy и pandas (библиотеки numpy и pandas в python)
Для векторизованных операций (умножение, сложение) предпочтительнее использовать прямые арифметические операции: df['new'] = df['a'] * 2, так как они быстрее.
Проблемы: apply медленнее векторизованных методов при больших данных. Решение: для сложных условий использовать np.select() или pd.cut() (для бинаризации).
Цель: создание новых признаков на основе существующих.
Как работать с датами в pandas?
После преобразования столбца в тип datetime доступны атрибуты .dt.
df['date'] = pd.to_datetime(df['date'])
df['year'] = df['date'].dt.year
df['month_name'] = df['date'].dt.month_name(locale='Russian')
df['weekday'] = df['date'].dt.dayofweek # 0=Monday
# Фильтрация по диапазону
mask = (df['date'] >= '2023-01-01') & (df['date'] <= '2023-12-31')
df_2023 = df.loc[mask]
pd.to_datetime() может автоматически распознавать множество форматов дат. Для неудачных парсингов существует параметр errors='coerce', который заменяет некорректные значения на NaT.
Проблемы: разные региональные форматы (месяц/день). Решение: явно указать format или dayfirst. При работе с большими объёмами многократное обращение к .dt может быть медленным - лучше вычислить все производные за один проход.
Цель: анализ временных рядов, трендов, сезонности.
Расширенные примеры работы с pandas
Оконные функции (rolling, expanding)
Оконные функции позволяют вычислять скользящие статистики, что полезно для временных рядов.
import pandas as pd
import numpy as np
dates = pd.date_range('2023-01-01', periods=10, freq='D')
df = pd.DataFrame({'date': dates, 'value': [1,3,2,5,4,6,8,7,9,10]})
df.set_index('date', inplace=True)
# Скользящее среднее с окном 3
df['rolling_mean_3'] = df['value'].rolling(window=3).mean()
# Экспоненциальное скользящее среднее
df['ewm'] = df['value'].ewm(span=3, adjust=False).mean()
# Расширяющееся среднее (от начала до текущей точки)
df['expanding_mean'] = df['value'].expanding().mean()
print(df)
value rolling_mean_3 ewm expanding_mean
date
2023-01-01 1 NaN 1.000000 1.000000
2023-01-02 3 NaN 2.000000 2.000000
2023-01-03 2 2.000000 2.000000 2.000000
2023-01-04 5 3.333333 3.500000 2.750000
2023-01-05 4 3.666667 3.750000 3.000000
2023-01-06 6 5.000000 4.875000 3.500000
2023-01-07 8 6.000000 6.437500 4.142857
2023-01-08 7 7.000000 6.718750 4.500000
2023-01-09 9 8.000000 7.859375 5.000000
2023-01-10 10 8.666667 8.929688 5.500000
Пояснение: rolling().mean() вычисляет среднее по окну заданной длины. Первые два значения NaN, так как окно не заполнено. ewm (exponentially weighted moving) придаёт больший вес новым данным. expanding() использует все предыдущие значения. Оконные функции также поддерживают sum, std, пользовательские функции через apply.
Работа с MultiIndex (иерархическая индексация)
MultiIndex позволяет работать с многомерными данными в двумерной структуре.
# Создание DataFrame с MultiIndex
index = pd.MultiIndex.from_tuples([('A',1),('A',2),('B',1),('B',2)], names=['group','id'])
df = pd.DataFrame({'value': [10,20,30,40]}, index=index)
print(df)
value
group id
A 1 10
2 20
B 1 30
2 40
# Выборка по первому уровню
print(df.loc['A'])
# Выборка по комбинации уровней
print(df.loc[('B',2)])
# Агрегация по одному уровню
print(df.groupby(level='group').sum())
value
id
1 10
2 20
40
value
group
A 30
B 70
Полезно при анализе панельных данных или сводок с несколькими категориями. Для создания MultiIndex из столбцов используется pd.MultiIndex.from_frame или set_index с несколькими столбцами.
Конвейер обработки с pipe
Метод pipe позволяет создавать цепочки пользовательских функций, улучшая читаемость.
def clean_data(df):
return df.dropna().reset_index(drop=True)
def add_features(df):
df['total'] = df['price'] * df['quantity']
df['discount_flag'] = df['discount'] > 0
return df
def filter_outliers(df, col, threshold=3):
z_scores = (df[col] - df[col].mean()) / df[col].std()
return df[z_scores.abs() < threshold]
df = (pd.read_csv('transactions.csv')
.pipe(clean_data)
.pipe(add_features)
.pipe(filter_outliers, col='total', threshold=2.5)
)
Каждая функция принимает DataFrame и возвращает его. Параметры функций передаются после аргумента pipe (например, col и threshold). Такой подход облегчает тестирование и повторное использование кода.
Категориальные данные для ускорения и уменьшения памяти
Если столбец содержит ограниченное количество уникальных значений, его можно преобразовать в тип category.
df = pd.DataFrame({'city': ['Moscow','Moscow','SPb','SPb','Kazan']*100000})
print('До:', df.memory_usage(deep=True))
df['city'] = df['city'].astype('category')
print('После:', df.memory_usage(deep=True))
Вывод (примерный):
До: city 4000000 После: city 500160
Экономия памяти может достигать 10 раз. Категориальные данные также ускоряют группировку и сортировку. Для упорядоченных категорий (например, 'low','medium','high') можно задать порядок с помощью CategoricalDtype.
from pandas.api.types import CategoricalDtype
cat_type = CategoricalDtype(categories=['low','medium','high'], ordered=True)
df['price_cat'] = pd.Categorical(df['price_category'], dtype=cat_type)
print(df['price_cat'].min()) # low