Использование pandas и numpy для анализа информации
Основные подходы к анализу данных с pandas и numpy
Эффективное решение: полный цикл анализа с загрузкой, очисткой и группировкой
Рассмотрим наиболее продуктивный способ выполнения типовых задач анализа данных с использованием pandas и numpy. Основной упор делается на векторизованные операции, которые работают значительно быстрее поэлементных циклов.
import pandas as pd
import numpy as np
# Загрузка данных (пример с синтетическим DataFrame)
df = pd.DataFrame({
'Город': ['Москва', 'СПб', 'Казань', 'Москва', 'СПб'],
'Продажи': [120, 150, 90, 110, 130],
'Месяц': [1, 1, 2, 2, 2]
})
# Очистка: удаление дубликатов
df = df.drop_duplicates()
# Преобразование: новый столбец с бонусом (10% от продаж) с помощью numpy
df['Бонус'] = np.where(df['Продажи'] > 120, df['Продажи'] * 0.15, df['Продажи'] * 0.1)
# Группировка и агрегация
summary = df.groupby('Город')['Продажи'].agg(['sum', 'mean', 'count'])
print(summary)
Python для анализа данных (python для анализа данных)
В данном примере drop_duplicates удаляет повторяющиеся строки, а np.where позволяет векторизованно применить условие для вычисления бонуса. Группировка с агрегацией даёт сводку по городам.
Частая ошибка:
Забыть про inplace=True при использовании методов, изменяющих DataFrame. Многие методы возвращают копию, поэтому результат нужно присваивать.
Как выполнить фильтрацию строк с помощью булевой маски?
Вариант решения: создание условия на основе одного или нескольких столбцов и передача его в квадратные скобки.
filtered_df = df[(df['Продажи'] > 100) & (df['Город'] == 'Москва')]
print(filtered_df)
анализ больших данных python (анализ больших данных в python)
Оператор & используется для логического И. Важно заключать каждое условие в скобки из-за приоритета операторов.
Типичная ошибка: использование and вместо &. Для поэлементной логики в pandas нужны битовые операторы.
Цель: отбор строк, удовлетворяющих нескольким критериям, без написания циклов.
Как применить пользовательскую функцию к столбцу?
Вариант: метод apply или transform.
def categorize_sales(x):
if x > 120:
return 'Высокие'
elif x > 100:
return 'Средние'
else:
return 'Низкие'
df['Категория'] = df['Продажи'].apply(categorize_sales)
Python анализ данных excel (анализ данных excel в python)
apply поэлементно вызывает функцию для каждого значения. Медленнее векторизованных решений, но гибче.
Ошибка: изменение исходного DataFrame внутри функции без явного копирования может привести к неожиданностям. Лучше возвращать новое значение.
Случай использования: сложная логика, которую трудно выразить через np.where.
Как обработать пропущенные значения?
Вариант: fillna или dropna.
df.loc[2, 'Продажи'] = np.nan # имитация пропуска
df['Продажи'] = df['Продажи'].fillna(df['Продажи'].mean())
Заполнение пропусков средним значением - одна из распространённых стратегий. Можно использовать метод вперёд/назад (method='ffill').
Проблема: заполнение средним искажает распределение, если пропусков много. Нужно понимать природу данных.
Цель: привести данные к пригодному для анализа виду без потери строк.
Расширенные примеры работы с pandas и numpy
Пример 1: Оконные функции и скользящее среднее
import pandas as pd
import numpy as np
dates = pd.date_range('2024-01-01', periods=10)
df = pd.DataFrame({'Дата': dates, 'Значение': np.random.randn(10).cumsum()})
df['Скользящее_среднее'] = df['Значение'].rolling(window=3).mean()
print(df)
Дата Значение Скользящее_среднее
0 2024-01-01 1.234567 NaN
1 2024-01-02 2.345678 NaN
2 2024-01-03 3.456789 2.345678
3 2024-01-04 4.567890 3.456789
...
Используется для сглаживания временных рядов. Первые два значения NaN, так как окно не набирается.
Пример 2: Сводные таблицы (pivot_table)
df_sales = pd.DataFrame({
'Год': [2023, 2023, 2024, 2024],
'Квартал': ['Q1','Q2','Q1','Q2'],
'Продажи': [100, 200, 150, 250]
})
pivot = df_sales.pivot_table(index='Год', columns='Квартал', values='Продажи', aggfunc='sum')
print(pivot)
Квартал Q1 Q2 Год 2023 100 200 2024 150 250
Позволяет перестроить данные в кросс-таблицу с агрегацией.
Пример 3: Условное присваивание с помощью numpy.select
conditions = [
df['Продажи'] > 120,
df['Продажи'] > 100
]
choices = ['Высокие', 'Средние']
df['Категория'] = np.select(conditions, choices, default='Низкие')
Более гибкий аналог np.where для множественных условий. Работает быстрее apply.
Пример 4: Объединение данных с merge (сложные ключи)
df_left = pd.DataFrame({'ID': [1,2,3], 'Имя': ['A','B','C']})
df_right = pd.DataFrame({'ID': [2,3,4], 'Оценка': [85,90,95]})
merged = pd.merge(df_left, df_right, on='ID', how='outer', indicator=True)
print(merged)
ID Имя Оценка _merge 0 1 A NaN left_only 1 2 B 85.0 both 2 3 C 90.0 both 3 4 NaN 95.0 right_only
Индикатор показывает, из какой таблицы пришла строка.
Пример 5: Векторизованная работа с датами (numpy + pandas)
df['Дата'] = pd.to_datetime(df['Дата'])
df['Год'] = df['Дата'].dt.year
df['Разница_дней'] = (df['Дата'].max() - df['Дата']).dt.days
print(df[['Дата','Год','Разница_дней']].head())
Использование pd.to_datetime и доступа .dt для извлечения компонентов даты.