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 Добавьте суффиксы, чтобы различать дублирующиеся имена столбцов

Пример

import pandas as pd

# Пример данных
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 Предоставить иерархический индекс для объединённых объектов

Пример

import pandas as pd

# Пример данных
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 Столбец для соединения; по умолчанию используется индекс

Пример

import pandas as pd

# Пример данных
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 Заполнение пропущенных значений

Пример

import pandas as pd

# Пример данных
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

Пример

import pandas as pd

# Пример данных
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

Пример

import pandas as pd

# Пример данных
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 Функция для применения

Пример

import pandas as pd

# Пример данных
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 для применения

Пример

import pandas as pd

# Пример данных
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)

Пример

import pandas as pd

# Пример данных
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 Функция агрегирования, может быть строкой или пользовательской функцией

Пример

import pandas as pd

# Пример данных
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означает часы, и т. д.)

Пример

import pandas as pd

# Создание временного ряда
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()вы можете выполнять операции сложения и вычитания времени.

Пример

import pandas as pd

# Смещение даты
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() Вычислить операции с расширяющимся окном, кумулятивные значения

Пример

import pandas as pd

# Пример данных
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 pandas as pd
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 Имя каждого уровня индекса (необязательно)

Пример

import pandas as pd

# Создать кортежи
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 Имя каждого уровня индекса (необязательно)

Пример

import pandas as pd

# Создать несколько списков
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 Имена столбцов, используемые в качестве индекса (может быть один столбец или несколько столбцов)

Пример

import pandas as pd

# Пример данных
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[]для выбора данных:

Пример

import pandas as pd

# Пример данных
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.

Пример

# Используйте xs, чтобы получить все данные, где 'Number' равен 1
print(df.xs(1, level='Number'))

Вывод:

        Value
Letter       
A          10
B          30

2. Срезы MultiIndex

Pandas поддерживает операции срезов по MultiIndex, позволяя выбирать различные подмножества по уровню индекса.

Пример

# Выбрать все данные, где Letter равен 'A'
print(df.loc['A'])

Вывод:

        Value
Number       
1          10
2          20

3. Сортировка MultiIndex

Pandas'sort_index()метод поддерживает сортировку MultiIndex.

Пример

# Сортировка по 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()может выполнять мощные операции агрегации, подходящие для статистического анализа сложных данных.

Пример

# Используйте groupby для агрегации по MultiIndex
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
Другие расширения