Pandas: продвинутые возможности
Pandas предоставляет чрезвычайно мощные функции для работы с данными, подходящие для сложных задач, таких как очистка данных, анализ, агрегация и обработка временных рядов. Освоение продвинутых возможностей Pandas может значительно повысить эффективность обработки и анализа данных.
1. Слияние и соединение данных
Pandas предоставляет несколько методов для слияния и конкатенации различных DataFrame, таких какmerge()、concat()иjoin(). Эти методы часто используются для обработки нескольких наборов данных и сложных задач слияния.
1. merge()— Соединение в стиле базы данных
merge()метод позволяет объединять два DataFrame на основе определённых столбцов, аналогично SQLJOINоперации. Он поддерживает внутренние, внешние, левые и правые соединения.
| Parameters | Описание |
|---|---|
left |
Левый DataFrame |
right |
Правый DataFrame |
how |
Метод merge, поддерживает'inner', 'outer', 'left', 'right' |
on |
Имя(имена) столбца(ов) для соединения (если имена столбцов различаются с обеих сторон, можно использоватьleft_onиright_on) |
left_on |
Столбец(ы) в левом DataFrame для соединения |
right_on |
Столбец(ы) в правом DataFrame для соединения |
suffixes |
Добавьте суффиксы, чтобы различать дублирующиеся имена столбцов |
Пример
# Пример данных
left = pd.DataFrame({'ID': [1, 2, 3], 'Name': ['Alice', 'Bob', 'Charlie']})
right = pd.DataFrame({'ID': [1, 2, 4], 'Age': [24, 27, 22]})
# Используйте merge для внутреннего соединения
result = pd.merge(left, right, on='ID', how='inner')
print(result)
Вывод:
ID Name Age 0 1 Alice 24 1 2 Bob 27
2. concat()— Конкатенация вдоль оси
concat()Он используется для объединения нескольких DataFrames вдоль заданной оси (строк или столбцов), обычно применяется для объединения по строкам (вертикальная конкатенация) или объединения по столбцам (горизонтальная конкатенация).
| Parameters | Описание |
|---|---|
objs |
Список DataFrames для конкатенации |
axis |
Ось конкатенации,0указывает на объединение по строкам,1указывает на объединение по столбцам |
ignore_index |
Следует ли игнорировать индекс и создавать его заново (по умолчаниюFalse) |
keys |
Предоставить иерархический индекс для объединённых объектов |
Пример
# Пример данных
df1 = pd.DataFrame({'A': [1, 2, 3]})
df2 = pd.DataFrame({'A': [4, 5, 6]})
# Конкатенация по строкам
result = pd.concat([df1, df2], axis=0, ignore_index=True)
print(result)
Вывод:
A 0 1 1 2 2 3 3 4 4 5 5 6
3. join()— Соединение по индексу
join()метод — это упрощённая операция соединения в Pandas, обычно используемая для соединения нескольких DataFrame на основе индекса.
| Parameters | Описание |
|---|---|
other |
Другой DataFrame для соединения |
how |
Метод merge, поддерживает'left', 'right', 'outer', 'inner' |
on |
Столбец для соединения; по умолчанию используется индекс |
Пример
# Пример данных
left = pd.DataFrame({'A': [1, 2, 3]}, index=[1, 2, 3])
right = pd.DataFrame({'B': [4, 5, 6]}, index=[1, 2, 4])
# Используйте join для соединения
result = left.join(right, how='inner')
print(result)
Вывод:
A B 1 1 4 2 2 5
2. Сводные таблицы и кросс-табуляции
Pandas предоставляетpivot_table()метод для создания сводных таблиц, иcrosstab()метод для вычисления кросс-табуляций. Как сводные таблицы, так и кросс-табуляции хорошо подходят для обобщения и перегруппировки данных.
1. pivot_table()— Создание сводных таблиц
| Parameters | Описание |
|---|---|
data |
Входные данные |
values |
Столбец для суммирования |
index |
Столбец, используемый в качестве индекса строк |
columns |
Столбец, используемый в качестве индекса столбцов |
aggfunc |
Функция агрегации, по умолчаниюmean, может бытьsum, countожидание |
fill_value |
Заполнение пропущенных значений |
Пример
# Пример данных
data = {'Date': ['2024-01-01', '2024-01-02', '2024-01-03', '2024-01-04'],
'Category': ['A', 'B', 'A', 'B'],
'Sales': [100, 150, 200, 250]}
df = pd.DataFrame(data)
# Создание сводной таблицы
pivot_table = pd.pivot_table(df, values='Sales', index='Date', columns='Category', aggfunc='sum', fill_value=0)
print(pivot_table)
Вывод:
Category A B Date 2024-01-01 100 0 2024-01-02 0 150 2024-01-03 200 0 2024-01-04 0 250
2. crosstab()— Создание кросс-табуляций
| Parameters | Описание |
|---|---|
index |
Метки строк |
columns |
Метки столбцов |
values |
Данные, используемые для (необязательно) |
aggfunc |
Функция агрегирования, по умолчаниюcount |
Пример
# Пример данных
data = {'Category': ['A', 'B', 'A', 'B', 'A', 'B'],
'Region': ['North', 'South', 'North', 'South', 'West', 'East']}
df = pd.DataFrame(data)
# Создать кросс-табуляцию
cross = pd.crosstab(df['Category'], df['Region'])
print(cross_table)
Вывод:
Region East North South West Category A 0 2 0 1 B 1 0 1 0
3. Применение пользовательских функций
Pandas предоставляет несколько способов применения пользовательских функций для очистки и преобразования данных.
1. apply()— Применение функций к DataFrame или Series
apply()метод позволяет применять пользовательские функции к DataFrame или Series, поддерживая операции со строками или столбцами.
| Parameters | Описание |
|---|---|
func |
Функция для применения |
axis |
По умолчанию —0, указывает на применение по столбцам;1указывает на применение по строкам |
raw |
Передавать ли исходные данные (по умолчанию —False) |
result_type |
Определите тип вывода, напримерexpand, reduce, broadcast |
Пример
# Пример данных
df = pd.DataFrame({'A': [1, 2, 3, 4], 'B': [10, 20, 30, 40]})
# Определяем пользовательскую функцию
def custom_func(x):
return x * 2
# Применяем функцию к столбцам
df['A'] = df['A'].apply(custom_func)
print(df)
Вывод:
A B 0 2 10 1 4 20 2 6 30 3 8 40
2. applymap()— Применение функции ко всему DataFrame
applymap()Его можно применять только к DataFrame, и он действует на каждый элемент в DataFrame.
| Parameters | Описание |
|---|---|
func |
Функция для применения |
Пример
# Пример данных
df = pd.DataFrame({'A': [1, 2, 3], 'B': [4, 5, 6]})
# Применить пользовательскую функцию к DataFrame
df = df.applymap(lambda x: x ** 2)
print(df)
Вывод:
A B 0 1 16 1 4 25 2 9 36
3. map()— Применение функции к Series
map()Вы можете применить функцию или сопоставление к каждому элементу в Series.
| Parameters | Описание |
|---|---|
arg |
Функция, словарь или Series для применения |
Пример
# Пример данных
df = pd.DataFrame({'A': ['cat', 'dog', 'rabbit']})
# Использовать словарь для сопоставления
df['A'] = df['A'].map({'cat': 'kitten', 'dog': 'puppy'})
print(df)
Вывод:
A
0 kitten
1 puppy
2 NaN
4. Операции группировки и агрегирования
В Pandas,groupby()метод очень мощный и может использоваться для групповой агрегации, преобразования данных и фильтрации данных. С помощьюgroupby(), можно группировать данные по определённым условиям и выполнять операции агрегирования, такие как сумма, среднее, количество и т. д.
1. groupby()— Группировка данных
| Parameters | Описание |
|---|---|
by |
Группировать по какому столбцу или индексу |
axis |
Ось группировки, по умолчанию0, то есть группировка по строкам |
level |
Группировать по уровню индекса (применимо к MultiIndex) |
Пример
# Пример данных
df = pd.DataFrame({
'Category': ['A', 'B', 'A', 'B', 'A', 'B'],
'Значение': [10, 20, 30, 40, 50, 60]
})
# Группировать по столбцу Category и вычислить сумму для каждой группы
grouped = df.groupby('Category')['Value'].sum()
print(grouped)
Вывод:
Category A 90 B 120 Name: Value, dtype: int64
2. Операции агрегирования (agg())
agg()Используется для выполнения сложных операций агрегирования; можно передать несколько функций, чтобы одновременно вычислить несколько агрегированных значений.
| Parameters | Описание |
|---|---|
func |
Функция агрегирования, может быть строкой или пользовательской функцией |
Пример
# Пример данных
df = pd.DataFrame({
'Category': ['A', 'B', 'A', 'B', 'A', 'B'],
'Значение': [10, 20, 30, 40, 50, 60]
})
# Используйте agg() для выполнения нескольких операций агрегирования
grouped = df.groupby('Category')['Value'].agg([sum, min, max])
print(grouped)
Вывод:
sum min max Category A 90 10 50 B 120 20 60
5. Обработка временных рядов
Pandas предоставляет мощные возможности обработки временных рядов, включая разбор дат, преобразование частоты, генерацию диапазона дат, операции с временными окнами и т. д.
1. date_range()— Генерация временных рядов
| Параметр | Описание |
|---|---|
start |
Дата начала |
end |
Дата окончания |
periods |
Количество генерируемых временных точек |
freq |
Частота (например,Dозначает дни,Hозначает часы, и т. д.) |
Пример
# Создание временного ряда
date_range = pd.date_range(start='2024-01-01', periods=5, freq='D')
print(date_range)
Вывод:
DatetimeIndex(['2024-01-01', '2024-01-02', '2024-01-03', '2024-01-04', '2024-01-05'], dtype='datetime64[ns]', freq='D')
2. Смещения даты и времени
Использованиеpd.Timedelta()вы можете выполнять операции сложения и вычитания времени.
Пример
# Смещение даты
date = pd.to_datetime('2024-01-01')
new_date = date + pd.Timedelta(days=10)
print(new_date)
Вывод:
2024-01-11 00:00:00
3. Операции с временными окнами (Rolling, Expanding)
Использованиеrolling()иexpanding()методы выполнения операций со скользящим и расширяющимся окном, обычно используемые в таких вычислениях, как скользящие средние во временных рядах.
| Метод | Описание |
|---|---|
rolling() |
Вычислить операции со скользящим окном, обычно используемые для скользящих средних и т. д. |
expanding() |
Вычислить операции с расширяющимся окном, кумулятивные значения |
Пример
# Пример данных
df = pd.DataFrame({'Value': [10, 20, 30, 40, 50]})
# Вычислить 3-дневное скользящее среднее
df['Rolling_Mean'] = df['Value'].rolling(window=3).mean()
print(df)
Вывод:
Value Rolling_Mean 0 10 NaN 1 20 NaN 2 30 20.000000 3 40 30.000000 4 50 40.000000
6. Обработка пропущенных значений
Pandas предоставляет несколько методов для обработки пропущенных значений (таких как NaN). Обычные операции включают заполнение пропущенных значений, удаление пропущенных значений и т. д.
| Метод | Описание |
|---|---|
isna() |
Проверить наличие пропущенных значений, вернуть булевы значения |
fillna() |
Заполнение пропущенных значений |
dropna() |
Удалить строки или столбцы, содержащие пропущенные значения |
Пример
import numpy as np
# Пример данных
df = pd.DataFrame({
'A': [1, 2, np.nan, 4],
'B': [5, np.nan, 7, 8]
})
# Заполнить пропущенные значения
df_filled = df.fillna(0)
print(df_filled)
Вывод:
A B 0 1 5 1 2 0 2 0 7 3 4 8
7. MultiIndex
Pandas предоставляет функцию MultiIndex, позволяющую работать со сложными структурами данных в DataFrame или Series, что особенно подходит для иерархических данных. С помощью MultiIndex можно выполнять такие операции, как группировка, выбор, срезы и агрегирование данных.
1. Создание MultiIndex
Можно создать с помощьюpd.MultiIndex.from_tuples()、pd.MultiIndex.from_product()илиset_index()методов для создания MultiIndex.
Способ 1:pd.MultiIndex.from_tuples()
Используйте кортежи для создания MultiIndex, где каждый кортеж соответствует одному уровню индекса.
| Параметр | Описание |
|---|---|
tuples |
Каждый кортеж соответствует одному значению индекса |
names |
Имя каждого уровня индекса (необязательно) |
Пример
# Создать кортежи
index_tuples = [('A', 1), ('A', 2), ('B', 1), ('B', 2)]
# Создать MultiIndex
multi_index = pd.MultiIndex.from_tuples(index_tuples, names=['Letter', 'Number'])
# Создать DataFrame
df = pd.DataFrame({'Value': [10, 20, 30, 40]}, index=multi_index)
print(df)
Вывод:
Value
Letter Number
A 1 10
2 20
B 1 30
2 40
Метод 2: pd.MultiIndex.from_product()
Используйте декартово произведение нескольких списков для создания MultiIndex, подходит для случаев с большим количеством измерений данных.
| Параметр | Описание |
|---|---|
iterables |
Несколько списков или массивов |
names |
Имя каждого уровня индекса (необязательно) |
Пример
# Создать несколько списков
index_values = [['A', 'B'], [1, 2]]
# Создать MultiIndex
multi_index = pd.MultiIndex.from_product(index_values, names=['Letter', 'Number'])
# Создать DataFrame
df = pd.DataFrame({'Value': [10, 20, 30, 40]}, index=multi_index)
print(df)
Вывод:
Value
Letter Number
A 1 10
2 20
B 1 30
2 40
Метод 3: Использованиеset_index()Создание MultiIndex
set_index()Метод может преобразовать столбцы DataFrame в MultiIndex, что подходит для создания MultiIndex из существующих данных.
| Параметр | Описание |
|---|---|
keys |
Имена столбцов, используемые в качестве индекса (может быть один столбец или несколько столбцов) |
Пример
# Пример данных
data = {
'Letter': ['A', 'A', 'B', 'B'],
'Number': [1, 2, 1, 2],
'Значение': [10, 20, 30, 40]
}
df = pd.DataFrame(data)
# Установить MultiIndex
df.set_index(['Letter', 'Number'], inplace=True)
print(df)
Вывод:
Value
Letter Number
A 1 10
2 20
B 1 30
2 40
2. Операции с MultiIndex
1. Доступ к данным MultiIndex
Доступ к данным можно получить через иерархическую индексацию. Использованиеloc[]илиxs()(среза) делает выбор данных удобным.
Использованиеloc[]для выбора данных:
Пример
# Пример данных
data = {
'Letter': ['A', 'A', 'B', 'B'],
'Number': [1, 2, 1, 2],
'Значение': [10, 20, 30, 40]
}
df = pd.DataFrame(data)
# Установить MultiIndex
df.set_index(['Letter', 'Number'], inplace=True)
# Выбрать категорию 'A', все данные, где 'Number' равно 1
print(df.loc['A', 1])
Вывод:
Value 10 Name: (A, 1), dtype: int64
Использованиеxs()для получения данных поперечного сечения:
xs()Метод позволяет выбирать срезы на указанных уровнях в MultiIndex.
Пример
print(df.xs(1, level='Number'))
Вывод:
Value
Letter
A 10
B 30
2. Срезы MultiIndex
Pandas поддерживает операции срезов по MultiIndex, позволяя выбирать различные подмножества по уровню индекса.
Пример
print(df.loc['A'])
Вывод:
Value Number 1 10 2 20
3. Сортировка MultiIndex
Pandas'sort_index()метод поддерживает сортировку MultiIndex.
Пример
df_sorted = df.sort_index(level=['Letter', 'Number'], ascending=[True, False])
print(df_sorted)
Вывод:
Value
Letter Number
A 2 20
1 10
B 2 40
1 30
4. Операции агрегации
MultiIndex в сочетании сgroupby()может выполнять мощные операции агрегации, подходящие для статистического анализа сложных данных.
Пример
df_grouped = df.groupby(['Letter', 'Number']).sum()
print(df_grouped)
Вывод:
Value
Letter Number
A 1 10
2 20
B 1 30
2 40
5. Сброс индекса
Вы можете использоватьreset_index()метод для сброса MultiIndex в обычные столбцы.
Пример
df_reset = df.reset_index()
print(df_reset)
Вывод:
Letter Number Value 0 A 1 10 1 A 2 20 2 B 1 30 3 B 2 40
6. Пропущенные значения в MultiIndex
Пропущенные значения в MultiIndex можно обрабатывать с помощьюfillna()илиdropna()аналогично обычному индексу.
Пример
data = {
'Letter': ['A', 'A', 'B', 'B'],
'Number': [1, 2, 1, 2],
'Value': [10, None, 30, 40]
}
df = pd.DataFrame(data)
df.set_index(['Letter', 'Number'], inplace=True)
# Заполнить пропущенные значения
df_filled = df.fillna(0)
print(df_filled)
Вывод:
Value
Letter Number
A 1 10
2 0
B 1 30
2 40
Другие расширения