Анализ данных с помощью Python: Pandas и NumPy в действии
Основные подходы к анализу данных на Python
Как загрузить и предварительно обработать данные из CSV файла с пропусками?
Наиболее эффективный способ использует Pandas с указанием типов столбцов и обработкой пропусков при чтении:
import pandas as pd
import numpy as np
# Чтение с указанием типов и преобразованием пропусков
df = pd.read_csv('data.csv',
dtype={'age': np.float64, 'salary': np.float64},
na_values=['NA', 'N/A', ''])
# Заполнение пропусков медианным значением
for col in ['age', 'salary']:
if df[col].dtype in [np.float64, np.int64]:
df[col].fillna(df[col].median(), inplace=True)
print(df.head())Python для анализа данных (python для анализа данных)
Типичная ошибка: столбец содержит строковые значения NaN, но Pandas не распознаёт их как пропуски. Решение: явно указать список значений через na_values.
Проблема: при заполнении пропусков медианой для целочисленных столбцов тип может измениться на float. Для сохранения int используйте fillna с последующим преобразованием astype.
Как выполнить группировку данных с несколькими агрегациями?
Вариант с методом groupby и списком функций:
grouped = df.groupby('category')['salary'].agg(['mean', 'std', 'count'])
print(grouped)анализ больших данных python (анализ больших данных в python)
Другой вариант - использование NamedAgg для именования результатов:
import pandas as pd
agg_funcs = pd.NamedAgg(column='salary', aggfunc='median')
grouped2 = df.groupby('category').agg(avg_salary=pd.NamedAgg(column='salary', aggfunc='mean'),
med_salary=agg_funcs)
print(grouped2)
Python анализ данных excel (анализ данных excel в python)
Возможная ошибка: при использовании agg с несколькими функциями результат получается с MultiIndex. Для упрощения используйте reset_index или параметр as_index=False.
Как найти корреляцию между числовыми столбцами и визуализировать её?
Используется DataFrame.corr() и библиотека Seaborn:
corr_matrix = df[['age', 'salary', 'years_experience']].corr()
import seaborn as sns
import matplotlib.pyplot as plt
plt.figure(figsize=(8,6))
sns.heatmap(corr_matrix, annot=True, cmap='coolwarm')
plt.title('Корреляционная матрица')
plt.show()анализ данных python pdf (анализ данных pdf в python)
Альтернатива - использование corrwith для одного столбца:
corr_with_salary = df.corrwith(df['salary'])
print(corr_with_salary.sort_values(ascending=False))Python анализ данных и машинное обучение (анализ данных и машинное обучение на python)
Ошибка: корреляция вычисляется только для числовых столбцов. Если в DataFrame есть строковые данные, они игнорируются. Решение: предварительно выделить числовые столбцы через select_dtypes.
Как очистить данные от дубликатов и выбросов?
Базовый вариант:
# Удаление дубликатов по всем столбцам
df_clean = df.drop_duplicates()
# Удаление строк с выбросами (метод межквартильного размаха)
Q1 = df['salary'].quantile(0.25)
Q3 = df['salary'].quantile(0.75)
IQR = Q3 - Q1
lower_bound = Q1 - 1.5 * IQR
upper_bound = Q3 + 1.5 * IQR
df_no_outliers = df[(df['salary'] >= lower_bound) & (df['salary'] <= upper_bound)]
print(f'Было строк: {len(df)}, стало: {len(df_no_outliers)}')анализ данных с использованием python (анализ данных с использованием python)
Проблема: выбросы могут быть значимыми для анализа. Перед удалением стоит рассмотреть цензурирование (замена на границы) или отдельную обработку. Для проверки используйте boxplot.
Как применить пользовательскую функцию к каждому элементу или группе?
Через apply для столбца:
def categorize_salary(val):
if val < 30000:
return 'low'
elif val < 70000:
return 'medium'
else:
return 'high'
df['salary_category'] = df['salary'].apply(categorize_salary)Python анализ текстовых данных (анализ текстовых данных в python)
Для группы - transform:
df['salary_normalized'] = df.groupby('category')['salary'].transform(lambda x: (x - x.mean()) / x.std())
Ошибка: apply возвращает Series с индексом, что может вызвать проблемы при добавлении в DataFrame. Используйте result_type='expand' для возврата DataFrame.
Расширенные примеры анализа данных
Как выполнить слияние нескольких таблиц разных структур?
# Пример объединения трёх DataFrame с разными ключами
import pandas as pd
df_orders = pd.DataFrame({'order_id': [1,2,3],
'customer_id': [101,102,103],
'amount': [250, 300, 150]})
df_customers = pd.DataFrame({'customer_id': [101,102,104],
'name': ['Иван', 'Мария', 'Петр']})
df_items = pd.DataFrame({'order_id': [1,2,2,3],
'item': ['ноутбук', 'мышь', 'клавиатура', 'монитор']})
# Сначала left join customers к orders
merged = pd.merge(df_orders, df_customers, on='customer_id', how='left')
# Затем inner join с items
final = pd.merge(merged, df_items, on='order_id', how='inner')
print(final)
order_id customer_id amount name item 0 1 101 250 Иван ноутбук 1 2 102 300 Мария мышь 2 2 102 300 Мария клавиатура 3 3 103 150 NaN монитор
Как создать сводную таблицу (pivot) с множественными индексами и значениями?
# Предположим, есть данные о продажах по месяцам и категориям
sales = pd.DataFrame({
'month': ['Янв','Янв','Фев','Фев','Мар','Мар'],
'category': ['A','B','A','B','A','B'],
'revenue': [100, 200, 150, 250, 130, 210],
'quantity': [10, 20, 15, 25, 13, 21]
})
# Сводная: строки - месяц, столбцы - категория, значения - сумма revenue
pivot_table = pd.pivot_table(sales,
values='revenue',
index='month',
columns='category',
aggfunc='sum',
fill_value=0)
print(pivot_table)
category A B month Фев 150 250 Мар 130 210 Янв 100 200
Как работать с временными рядами: ресемплинг и скользящее среднее?
# Создание временного ряда с датами
dates = pd.date_range('2023-01-01', periods=100, freq='D')
ts = pd.Series(np.random.randn(100).cumsum(), index=dates)
# Ресемплинг по неделям и усреднение
weekly = ts.resample('W').mean()
# Скользящее среднее за 7 дней
rolling = ts.rolling(window=7).mean()
# Вывод первых 10 значений исходного ряда и скользящего среднего
print(pd.concat([ts.head(10), rolling.head(10)], axis=1).head(10))
0 1 2023-01-01 -0.975260 NaN 2023-01-02 -1.814599 NaN 2023-01-03 -2.724632 NaN 2023-01-04 -3.312218 NaN 2023-01-05 -2.937545 NaN 2023-01-06 -3.564893 NaN 2023-01-07 -3.079528 -2.629811 2023-01-08 -3.891894 -3.046473 2023-01-09 -3.428841 -3.277079 2023-01-10 -3.970819 -3.312248
Как использовать NumPy для быстрых математических операций с DataFrame?
# Применение numpy функций к столбцам
df = pd.DataFrame({'a': [1,2,3], 'b': [4,5,6]})
df['c'] = np.sqrt(df['a']**2 + df['b']**2) # евклидово расстояние
# Векторизованная замена значений с np.where
df['d'] = np.where(df['a'] > df['b'].mean(), 'big', 'small')
print(df)
a b c d 0 1 4 4.123106 small 1 2 5 5.385165 small 2 3 6 6.708204 small
Как выполнить перекрёстную таблицу (crosstab) с нормализацией?
# Данные опроса: пол и предпочтения
data = {'gender': ['M','F','M','F','M','F'],
'preference': ['A','A','B','B','A','B']}
df_survey = pd.DataFrame(data)
# Перекрёстная таблица с процентами по строкам
ct = pd.crosstab(df_survey['gender'], df_survey['preference'], normalize='index')
print(ct)
preference A B gender F 0.333333 0.666667 M 0.666667 0.333333
Как обрабатывать категориальные данные с помощью get_dummies и OneHotEncoder?
# Простой способ: pd.get_dummies
df = pd.DataFrame({'city': ['Moscow','SPb','Moscow','Kazan']})
dummies = pd.get_dummies(df['city'], prefix='city')
df = pd.concat([df, dummies], axis=1)
print(df)
city city_Kazan city_Moscow city_SPb 0 Moscow 0 1 0 1 SPb 0 0 1 2 Moscow 0 1 0 3 Kazan 1 0 0
Как использовать query для фильтрации с условиями из переменных?
# Фильтрация с помощью f-строк в query
min_salary = 40000
max_salary = 80000
# Безопасно передаём переменные через @
filtered = df.query('salary >= @min_salary and salary <= @max_salary')
print(filtered.shape)
(15, 5) # примерное количество строк
Как объединить несколько Excel файлов с разными листами в один DataFrame?
import glob
all_files = glob.glob('data/*.xlsx')
df_list = []
for file in all_files:
# Чтение всех листов
xls = pd.ExcelFile(file)
for sheet in xls.sheet_names:
temp = pd.read_excel(file, sheet_name=sheet)
temp['source'] = f'{file}_{sheet}'
df_list.append(temp)
df_combined = pd.concat(df_list, ignore_index=True)
print(f'Всего строк: {len(df_combined)}')