Аналитические задачи: использование Pandas и библиотеки NumPy
Решение типовых задач анализа данных с помощью Pandas и NumPy
При работе с табличными и числовыми данными в Python основными инструментами являются библиотеки Pandas и NumPy. Далее рассмотрены наиболее эффективные подходы к решению распространенных задач, а также альтернативные варианты с пояснениями шагов, типичными ошибками и способами их исправления.
Эффективная загрузка и первичный осмотр данных
Самый продуктивный способ начать работу - использовать цепочки методов Pandas, которые позволяют загрузить, очистить и преобразовать данные в одном выражении. Например:
import pandas as pd
df = (pd.read_csv('sales.csv', parse_dates=['date'])
.dropna(subset=['amount'])
.assign(year=lambda x: x['date'].dt.year,
month=lambda x: x['date'].dt.month)
.query('amount > 0')
.groupby(['year', 'month'])['amount']
.agg(['sum', 'count'])
.reset_index())
Python для анализа данных (python для анализа данных)
Здесь загрузка с парсингом дат, удаление строк с пропусками в колонке amount, создание новых признаков (год, месяц), фильтрация положительных сумм, группировка и агрегация. Такой подход уменьшает количество промежуточных переменных и улучшает читаемость.
Типичная ошибка:
забыть указатьparse_dates для дат - тогда они будут загружены как строки, и операции с ними станут невозможны без дополнительного преобразования.
Решение:
всегда проверяйте типы данных с помощьюdf.dtypes после загрузки.Как загрузить CSV-файл с нестандартным разделителем и указать типы столбцов?
Используйте параметры sep, delimiter и dtype. Например, файл с разделителем точка с запятой и столбцом 'id', который должен быть строкой:
df = pd.read_csv('data.csv', sep=';', dtype={'id': str, 'price': float})
анализ больших данных python (анализ больших данных в python)
Проблема:
если в файле есть заголовки с пробелами, они могут быть некорректно распарсены. Рекомендуется указатьskipinitialspace=True.Как обработать пропуски в данных (разные стратегии)?
Заполнение пропусков зависит от контекста. Для числовых столбцов часто используется среднее или медиана, для категориальных - мода или отдельная метка.
df['age'].fillna(df['age'].median(), inplace=True) # числовой столбец
df['category'].fillna('unknown', inplace=True) # категориальный
Python анализ данных excel (анализ данных excel в python)
Другой вариант - удаление строк с пропусками в критичных столбцах:
df.dropna(subset=['email', 'amount'], inplace=True)
анализ данных python pdf (анализ данных pdf в python)
Ошибка:
заполнение всех пропусков нулями, если это не соответствует логике данных (например, возраст 0 исказит статистику). Рекомендуется предварительно изучить распределение значений.Как применить пользовательскую функцию к каждой строке или столбцу?
Самый простой способ - apply, но для числовых операций эффективнее векторизованные методы. Пример с применением функции к столбцу 'price' для расчёта налога:
def calc_tax(x):
return x * 0.13 if x > 1000 else x * 0.10
df['tax'] = df['price'].apply(calc_tax)
Python анализ данных и машинное обучение (анализ данных и машинное обучение на python)
Для операций, не требующих логики, лучше использовать map для замены значений:
df['status'] = df['status'].map({'active': 1, 'inactive': 0})
анализ данных с использованием python (анализ данных с использованием python)
Частая проблема:
apply медленно работает на больших данных. Альтернатива - NumPy-векторизация с np.where для условных операций.Как выполнить группировку и получить агрегированные статистики по нескольким метрикам?
Метод groupby с agg позволяет указать несколько функций для разных столбцов:
df.groupby('city').agg(
total_sales=('amount', 'sum'),
avg_price=('price', 'mean'),
count_orders=('order_id', 'count')
)
Python анализ текстовых данных (анализ текстовых данных в python)
Для сводной таблицы используйте pivot_table с индексами и значениями:
pd.pivot_table(df, values='amount', index='city', columns='category', aggfunc='sum', fill_value=0)
аналитик данных python sql (аналитик данных python sql)
Ошибка:
забыть сбросить индекс после группировки - данные останутся с мультииндексом, что усложнит дальнейшие операции. Используйте.reset_index().Как объединить два DataFrame по ключу (аналог SQL JOIN)?
Метод merge с указанием типа соединения:
df_merged = df_orders.merge(df_customers, on='customer_id', how='left')
Python библиотеки numpy и pandas (библиотеки numpy и pandas в python)
Для простого склеивания по строкам используйте pd.concat:
df_all = pd.concat([df1, df2], ignore_index=True)
библиотеки python для обработки данных (библиотеки python для обработки данных (pandas, numpy и др.))
Проблема:
если ключи в одном из датафреймов не уникальны, произойдёт декартово произведение строк. Перед объединением проверяйте дубликаты с помощьюduplicated().Как работать с датами: извлечение года, месяца, дня недели?
После преобразования столбца в datetime с помощью pd.to_datetime используйте accessor .dt:
df['date'] = pd.to_datetime(df['date'])
df['year'] = df['date'].dt.year
df['month'] = df['date'].dt.month
df['weekday'] = df['date'].dt.day_name()
математика и python для анализа данных (математика и python для анализа данных)
Фильтрация по диапазону дат:
mask = (df['date'] >= '2023-01-01') & (df['date'] <= '2023-12-31')
df_filtered = df[mask]
Ошибка:
попытка извлечь год из столбца, который остался строковым. Всегда проверяйте тип послеpd.to_datetime с аргументом errors='coerce', чтобы некорректные строки стали NaT.Расширенные примеры применения Pandas и NumPy
Ниже приведены более сложные сценарии, часто встречающиеся в реальных проектах по анализу данных.
Пример 1: Создание нового столбца на основе условия с помощью np.where
Векторизованное решение быстрее, чем apply, особенно на больших наборах данных.
import pandas as pd
import numpy as np
df = pd.DataFrame({'price': [1500, 800, 2000, 500], 'discount': [10, 5, 15, 0]})
df['final_price'] = np.where(df['discount'] > 0, df['price'] * (1 - df['discount']/100), df['price'])
price discount final_price 0 1500 10 1350.0 1 800 5 760.0 2 2000 15 1700.0 3 500 0 500.0
Пример 2: Добавление агрегированных значений без сжатия строк (transform)
transform возвращает объект той же формы, что и исходный DataFrame, что удобно для создания столбца с долей от группы.
df = pd.DataFrame({'city': ['A','A','B','B'], 'sales': [100,200,150,250]})
df['total_sales_city'] = df.groupby('city')['sales'].transform('sum')
df['share'] = df['sales'] / df['total_sales_city']
city sales total_sales_city share 0 A 100 300 0.333333 1 A 200 300 0.666667 2 B 150 400 0.375000 3 B 250 400 0.625000
Пример 3: Скользящее среднее с помощью rolling
Удобно для временных рядов, сглаживание шума.
df = pd.DataFrame({'value': [1,3,6,10,15,21]})
df['rolling_mean_3'] = df['value'].rolling(window=3).mean()
value rolling_mean_3 0 1 NaN 1 3 NaN 2 6 3.333333 3 10 6.333333 4 15 10.333333 5 21 15.333333
Пример 4: Фильтрация с помощью query для динамических условий
Позволяет писать условия в виде строки, что удобно при построении запросов на лету.
df = pd.DataFrame({'price': [100, 200, 150, 300], 'qty': [2, 1, 10, 5]})
result = df.query('price > 100 and qty < 10')
price qty 1 200 1 3 300 5
Пример 5: Быстрые арифметические операции с eval
Метод eval использует оптимизированные выражения, особенно полезен для больших датафреймов.
df = pd.DataFrame({'a': [1,2,3], 'b': [4,5,6]})
df['c'] = df.eval('a * 2 + b')
a b c 0 1 4 6 1 2 5 9 2 3 6 12
Пример 6: Чтение большого CSV-файла по частям (chunksize)
Когда файл не помещается в память, можно обрабатывать его порциями.
chunk_iter = pd.read_csv('large_file.csv', chunksize=10000)
results = []
for chunk in chunk_iter:
filtered = chunk[chunk['value'] > 0]
results.append(filtered['value'].sum())
total = sum(results)
Этот подход не нагружает память и позволяет агрегировать данные постепенно.
Пример 7: Применение пользовательской функции с помощью NumPy vectorize
Если функция уже написана на Python, можно создать векторизованную версию.
def discount(price, percent):
if percent > 10:
return price * 0.8
else:
return price * 0.95
vfunc = np.vectorize(discount)
df['discounted'] = vfunc(df['price'].values, df['discount'].values)
Однако следует помнить, что np.vectorize не ускоряет вычисления, а лишь делает синтаксис удобнее; для реальной производительности лучше использовать векторизованные операции.