Pandas Shift: Перемещение столбца DataFrame вверх или вниз

В этом руководстве вы научитесь использовать метод shift библиотеки Pandas для перемещения столбца DataFrame вверх или вниз. Умение сдвигать данные является важным навыком, особенно при работе с временными рядами или при расчете разницы между последовательными строками.

Метод Pandas shift() позволяет сдвигать данные вперед или назад, а также задавать сдвиг данных временных рядов через различные интервалы. Вы узнаете, как перемещать данные вперед или назад, заполнять вновь появившиеся пропуски и работать с данными временных рядов.

Если вы знакомы с SQL, **метод Pandas shift очень похож на функции LAG() и LEAD(), доступные через популярные оконные функции.

Быстрый ответ: используйте Pandas shift

# Объяснение метода Pandas .shift()

df.shift(
    periods=1,       # Количество периодов для сдвига
    freq=None,      # Сдвиг на основе данных временных рядов
    fill_value=None, # Чем заполнить отсутствующие данные после сдвига
    axis=0           # Сдвигать строки или столбцы
)

Оглавление

Объяснение сдвига Pandas

Метод shift в Pandas — это относительно простой метод, который открывает значительные возможности для вашего анализа. Например, вы можете сравнивать различия между последующими строками.

Если вы используете другие приложения для анализа данных (например, Excel), может показаться хорошей идеей сравнивать строки, запись за записью. Однако итерация по DataFrame в Pandas — медленный процесс.

Эта функция Pandas shift оказывается весьма полезной. Она предоставляет возможность сравнивать строки на разных интервалах в векторизованном формате.

Давайте посмотрим, как работает метод shift в Pandas и какие у него аргументы:

df.shift(
    periods=1,       # Количество периодов для сдвига (положительное - вниз/вправо, отрицательное - вверх/влево)
    freq=None,      # Сдвиг на основе данных временных рядов (например, 'D' для дней, 'H' для часов)
    fill_value=None, # Значение для заполнения отсутствующих данных после сдвига
    axis=0           # Ось для сдвига (0 - строки, 1 - столбцы)
)

Давайте рассмотрим, что делают параметры метода shift в Pandas

Аргумент
Тип данных
Объяснение

periods=

int

Количество периодов, на которые необходимо сдвинуть данные. Может быть положительным или отрицательным.

freq=

DateOffset, tseries.offsets, timedelta, or str, optional

Смещение для использования с различными данными временных рядов. Если индекс не установлен как временной ряд, будет вызвана ошибка.

fill_value=

object, optional

Скаляр для заполнения данных. Тип данных определяется из самого столбца, если только не передан другой тип данных.

axis=

{0 or ‘index’, 1 or ‘columns’, None}, default None

Направление, в котором следует смещаться

Загрузка образца Pandas Dataframe

Чтобы следовать этому руководству слово в слово, я предоставил пример DataFrame Pandas, который вы можете загрузить. Просто скопируйте и вставьте этот код в ваш любимый редактор кода, и мы можем начать:

# Загрузка примера DataFrame Pandas

import pandas as pd

# Создание DataFrame из словаря
df = pd.DataFrame.from_dict({
    'Name': ['Nik', 'Jane', 'Kate', 'Evan', 'Max', 'Kevin', 'Luke'],  # Имена
    'Amount': [100, 200, 210, 120, 70, 95, 90]  # Суммы
})

print(df.head())  # Вывод первых 5 строк DataFrame

# Результат:
#    Name  Amount
# 0   Nik     100
# 1  Jane     200
# 2  Kate     210
# 3  Evan     120
# 4   Max      70

Мы видим, что загрузили DataFrame с различными столбцами и затем вывели первые пять записей, используя метод df.head() из библиотеки Pandas

В следующем разделе вы узнаете, как сдвигать весь датафрейм, используя метод сдвига Pandas.

Сдвиг всего Dataframe с помощью Pandas Shift

Есть случаи, когда вам нужно переместить все записи в Pandas DataFrame вверх или вниз. Когда мы применяем метод .shift() ко всему dataframe, все записи в этом dataframe сдвигаются.

Один из аргументов метода .shift() в Pandas — это аргумент periods=, который позволяет передать целое число. Это число определяет количество периодов, на которое необходимо сдвинуть данные.

Если целое число, переданное в аргумент periods=, положительное, данные будут сдвинуты вниз. Если аргумент отрицательный, данные сдвигаются вверх.

Давайте попробуем переместить наши записи на одну строку вниз, используя Pandas

# Сдвиг всего DataFrame Pandas

import pandas as pd

df = pd.DataFrame.from_dict({'Name': ['Nik', 'Jane', 'Kate', 'Evan', 'Max', 'Kevin', 'Luke'], 'Amount': [100, 200, 210, 120, 70, 95, 90]})

# Вывод исходного DataFrame
print('Original dataframe')
print(df.head())

# Сдвиг DataFrame и повторный вывод
df = df.shift(periods=1)  # Сдвиг DataFrame на 1 период вниз
print('\nShifted Dataframe')
print(df.head())

# Результат:
# Original dataframe
#    Name  Amount
# 0   Nik     100
# 1  Jane     200
# 2  Kate     210
# 3  Evan     120
# 4   Max      70

# Shifted Dataframe
#    Name  Amount
# 0   NaN     NaN
# 1   Nik   100.0
# 2  Jane   200.0
# 3  Kate   210.0
# 4  Evan   120.0

Мы видим, что исходные данные сдвинуты на одну строку вниз.

Если мы хотим переместить наши данные на одну строку вверх, мы можем передать periods=-1. Давайте попробуем это сделать.

# Сдвиг всего DataFrame Pandas

import pandas as pd

df = pd.DataFrame.from_dict({'Name': ['Nik', 'Jane', 'Kate', 'Evan', 'Max', 'Kevin', 'Luke'], 'Amount': [100, 200, 210, 120, 70, 95, 90]})

# Вывод исходного DataFrame
print('Original dataframe')
print(df.head())

# Сдвиг DataFrame и повторный вывод
df = df.shift(periods=-1)  # Сдвиг DataFrame на 1 период вверх
print('\nShifted Dataframe')
print(df.head())

# Результат:
# Original dataframe
#    Name  Amount
# 0   Nik     100
# 1  Jane     200
# 2  Kate     210
# 3  Evan     120
# 4   Max      70

# Shifted Dataframe
#     Name  Amount
# 0   Jane   200.0
# 1   Kate   210.0
# 2   Evan   120.0
# 3    Max    70.0
# 4  Kevin    95.0

В следующем разделе вы узнаете, как сдвинуть значения только одного столбца в DataFrame Pandas.

Смещение значений строк Dataframe с помощью Pandas Shift

В предыдущем разделе вы научились сдвигать строки всего датафрейма. В этом разделе вы узнаете, как сдвигать значения только одного столбца. Это имеет множество практических применений, например, возможность вычислять разницу между последовательными записями (чему вы научитесь в следующем разделе этого руководства).

Способ, которым мы можем достичь этого в Pandas, заключается в применении функции к серии Pandas (т. е. столбцу), а не ко всему dataframe. Хотя не обязательно создавать новый столбец при этом (можно переопределить его же), мы создадим новый столбец, чтобы показать, как это работает.

В приведенном ниже примере мы сместим столбец Amount на одну запись вниз и назовем его Amount (Shifted) :

# Сдвиг одного столбца в DataFrame Pandas

import pandas as pd

df = pd.DataFrame.from_dict({'Name': ['Nik', 'Jane', 'Kate', 'Evan', 'Max', 'Kevin', 'Luke'], 'Amount': [100, 200, 210, 120, 70, 95, 90]})

df['Amount (Shifted)'] = df['Amount'].shift(periods=1)  # Создание нового столбца 'Amount (Shifted)' со сдвинутыми значениями столбца 'Amount' на 1 период вниз

print(df.head())  # Вывод первых 5 строк DataFrame

# Результат:
#    Name  Amount  Amount (Shifted)
# 0   Nik     100               NaN
# 1  Jane     200             100.0
# 2  Kate     210             200.0
# 3  Evan     120             210.0
# 4   Max      70             120.0

Мы видим, что значения из столбца Amount сдвинулись вниз на одну строку. Если мы просто хотим сдвинуть данные, а не создавать новый столбец, можно переназначить столбец самому себе: df['Amount'] = df['Amount'].shift(periods=1).

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

Заполнение пропущенных значений при использовании Pandas Shift

При сдвиге значений в DataFrame Pandas в результате может возникнуть отсутствие значений NaN в таблице. К счастью, метод сдвига Pandas включает аргумент fill_value=, который позволяет установить значение для заполнения пропусков.

Посмотрим, как можно сдвинуть данные Amount на строку вниз и заполнить значение числом 100:

# Сдвиг одного столбца в DataFrame Pandas и заполнение отсутствующих данных

import pandas as pd

df = pd.DataFrame.from_dict({'Name': ['Nik', 'Jane', 'Kate', 'Evan', 'Max', 'Kevin', 'Luke'], 'Amount': [100, 200, 210, 120, 70, 95, 90]})

df['Amount (Shifted)'] = df['Amount'].shift(periods=1, fill_value=100)  # Создание нового столбца 'Amount (Shifted)' со сдвинутыми значениями столбца 'Amount' на 1 период вниз и заполнением NaN значением 100

print(df.head())  # Вывод первых 5 строк DataFrame

# Результат:
#    Name  Amount  Amount (Shifted)
# 0   Nik     100               100
# 1  Jane     200               100
# 2  Kate     210               200
# 3  Evan     120               210
# 4   Max      70               120

Мы видим, что ранее отсутствующая первая строка теперь заполнена значением 100.

Бывают случаи, когда вам нужно заполнить пропуски в данных. Например, если вы хотите, чтобы значение заполнения было динамичным и адаптировалось к изменяющимся данным, можно использовать среднее значение столбца. Это можно сделать, передав в функцию, которая вычисляет среднее значение столбца Pandas DataFrame, в качестве параметра.

Давайте посмотрим, как мы можем заполнить недостающие данные путем замещения средним значением

# Сдвиг одного столбца в DataFrame Pandas и заполнение отсутствующих данных вычисленным средним значением

import pandas as pd

df = pd.DataFrame.from_dict({'Name': ['Nik', 'Jane', 'Kate', 'Evan', 'Max', 'Kevin', 'Luke'], 'Amount': [100, 200, 210, 120, 70, 95, 90]})

df['Amount (Shifted)'] = df['Amount'].shift(periods=1, fill_value=df['Amount'].mean())  # Создание нового столбца 'Amount (Shifted)' со сдвинутыми значениями столбца 'Amount' на 1 период вниз и заполнением NaN средним значением столбца 'Amount'

print(df.head())  # Вывод первых 5 строк DataFrame

# Результат:
#    Name  Amount  Amount (Shifted)
# 0   Nik     100               100
# 1  Jane     200               100
# 2  Kate     210               200
# 3  Evan     120               210
# 4   Max      70               120

В следующем разделе вы научитесь изменять временные ряды с помощью метода shift из библиотеки.

Сдвиг данных временных рядов с помощью Pandas Shift

Метод shift в Pandas может также сдвигать данные на основе временных рядов, что позволяет производить сложные сдвиги данных на разные временные периоды.

Чтобы продемонстрировать, как это работает, давайте создадим новый датафрейм, который имеет временной ряд в качестве индекса. Эта часть важна: если ваш индекс не является временным рядом, то метод вызовет ошибку.

# Загрузка DataFrame с индексом временного ряда

import pandas as pd

date_range = pd.date_range(start='2021-11-01', end='2021-11-30')  # Создание диапазона дат с 1 по 30 ноября 2021 года
values = [i for i in range(30)]  # Создание списка значений от 0 до 29

df = pd.DataFrame.from_dict({'Date':date_range, 'Amount':values}).set_index('Date')  # Создание DataFrame из словаря, установка столбца 'Date' в качестве индекса

print(df.head())  # Вывод первых 5 строк DataFrame

# Результат:
#             Amount
# Date              
# 2021-11-01       0
# 2021-11-02       1
# 2021-11-03       2
# 2021-11-04       3
# 2021-11-05       4

Видно, что у нас есть новый dataframe, где индекс — это диапазон дат, и есть только одно дополнительное значение: сумма, увеличивающаяся от 0 до 30.

Давайте посмотрим, как мы можем использовать аргумент freq=, чтобы задать временной интервал для сдвига нашего dataframe:

# Загрузка DataFrame с индексом временного ряда и сдвиг индекса

import pandas as pd

date_range = pd.date_range(start='2021-11-01', end='2021-11-30')  # Создание диапазона дат с 1 по 30 ноября 2021 года
values = [i for i in range(30)]  # Создание списка значений от 0 до 29
df = pd.DataFrame.from_dict({'Date':date_range, 'Amount':values}).set_index('Date')  # Создание DataFrame из словаря, установка столбца 'Date' в качестве индекса

df = df.shift(freq='5d')  # Сдвиг индекса на 5 дней вперед

print(df.head())  # Вывод первых 5 строк DataFrame

# Результат:
#             Amount
# Date              
# 2021-11-06       0
# 2021-11-07       1
# 2021-11-08       2
# 2021-11-09       3
# 2021-11-10       4 

Мы видим, что смогли добавить десять дней к каждому элементу в нашем индексе. Мы также можем вычесть десять дней из элементов индекса, изменив диапазон дат на отрицательную часть.

Преимущество использования аргумента freq= заключается в том, что он позволяет сохранять оригинальные данные, изменяя диапазоны дат.

В следующем разделе вы узнаете, как смещать столбцы в dataframe Pandas

Сдвиг столбцов Pandas Dataframe с помощью Pandas Shift

В этом учебнике вы уже узнали, как сдвигать строки в DataFrame с помощью Pandas. В этом разделе вы узнаете, как использовать аргумент axis=, чтобы иметь возможность сдвигать столбцы в вашем DataFrame.

# Сдвиг столбцов DataFrame Pandas

import pandas as pd

df = pd.DataFrame.from_dict({'Name': ['Nik', 'Jane', 'Kate', 'Evan', 'Max', 'Kevin', 'Luke'], 'Amount': [100, 200, 210, 120, 70, 95, 90]})

df = df.shift(periods=1, axis=1)  # Сдвиг столбцов DataFrame на 1 позицию вправо

print(df)  # Вывод DataFrame

# Результат:
#    Name Amount
# 0   NaN    Nik
# 1   NaN   Jane
# 2   NaN   Kate
# 3   NaN   Evan
# 4   NaN    Max
# 5   NaN  Kevin
# 6   NaN   Luke

Давайте разберем, что мы сделали здесь: мы применили метод .shift() ко всему датафрейму, изменив аргумент axis на 1. Возвращенный датафрейм имел все столбцы, сдвинутые на одну позицию, при этом имена столбцов остались прежними.

В следующих двух разделах вы изучите некоторые применимые функции метода shift в Pandas, включая вычисление разницы между последовательными строками и вычисление процентного изменения между последовательными строками.

Вычислить разницу между последовательными строками в Pandas

Существует много случаев, когда вам может понадобиться вычислить разницу между последовательными строками в датафрейме Pandas. К счастью, метод shift в Pandas делает эту операцию очень простой.

Давайте посмотрим, как мы можем использовать Pandas, чтобы сделать это:

# Вычисление разницы между последовательными строками в DataFrame Pandas

import pandas as pd

df = pd.DataFrame.from_dict({'Name': ['Nik', 'Jane', 'Kate', 'Evan', 'Max', 'Kevin', 'Luke'], 'Amount': [100, 200, 210, 120, 70, 95, 90]})

df['Amount (Shifted)'] = df['Amount'].shift(periods=1, fill_value=0)  # Создание столбца со сдвинутыми значениями 'Amount'
df['Amount (Difference)'] = df['Amount'] - df['Amount (Shifted)']  # Создание столбца с разницей между текущим и предыдущим значением

print(df)  # Вывод DataFrame

# Результат:
#     Name  Amount  Amount (Shifted)  Amount (Difference)
# 0    Nik     100                 0                  100
# 1   Jane     200               100                  100
# 2   Kate     210               200                   10
# 3   Evan     120               210                  -90
# 4    Max      70               120                  -50
# 5  Kevin      95                70                   25
# 6   Luke      90                95                   -5

Давайте разберём, что мы сделали здесь:

  1. Мы создаем новый столбец, Amount (Shifted), который сдвигает значения на одну строку вниз и заполняет любые отсутствующие значения нулями.

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

Мы также можем упростить эту процедуру, не создавая отдельный столбец, а просто записав всю операцию в одну строку:

df['Amount (Difference)'] = df['Amount'] - df['Amount'].shift(periods=1, fill_value=0)

Это избавляет нас от создания нового столбца, что может значительно увеличить использование памяти нашим датафрей.

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

Рассчитайте процентное изменение между последовательными строками в Pandas

В этом разделе вы узнаете, как использовать метод shift в Pandas для вычисления процентного изменения между последовательными строками в DataFrame Pandas

Давайте посмотрим, как это можно сделать, прежде чем мы разберём:

# Вычисление процентной разницы между последовательными строками в DataFrame Pandas

import pandas as pd

df = pd.DataFrame.from_dict({'Name': ['Nik', 'Jane', 'Kate', 'Evan', 'Max', 'Kevin', 'Luke'], 'Amount': [150, 200, 210, 120, 170, 195, 190]})

df['% Difference'] = (df['Amount'] - df['Amount'].shift(periods=1)) / df['Amount'].shift(periods=1)  # Вычисление процентной разницы и создание нового столбца

print(df)  # Вывод DataFrame

# Результат:
#     Name  Amount  % Difference
# 0    Nik     150           NaN
# 1   Jane     200      0.333333
# 2   Kate     210      0.050000
# 3   Evan     120     -0.428571
# 4    Max     170      0.416667
# 5  Kevin     195      0.147059
# 6   Luke     190     -0.025641

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

Заключение

В этом руководстве вы узнали, как использовать метод shift в Pandas для сдвига строк в DataFrame Pandas вверх или вниз. Вы также узнали, как работать с временными рядами и как заполнять пропущенные данные, созданные при сдвиге данных. Затем вы узнали, как сдвигать столбцы в DataFrame Pandas. Наконец, вы узнали два практических примера: как вычислить разницу между строками в Pandas и как вычислить процентную разницу между строками Pandas.

Чтобы узнать больше о методе shift библиотеки Pandas, изучите официальную документацию здесь.

Last updated