Аналитические задачи: использование Pandas и библиотеки NumPy

Раздел: Обработка данных -> 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.
- первичный анализ данных python (первичный анализ данных в python)
- приложения анализа данных на python (приложения анализа данных на python)
- программирование и анализ данных на python (программирование и анализ данных на python)

Расширенные примеры применения 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 не ускоряет вычисления, а лишь делает синтаксис удобнее; для реальной производительности лучше использовать векторизованные операции.

Задачи для анализа данных на Python - comments

En
Python задачи для анализа (python)