Как перемешать строки Pandas Dataframe в Python

В этом руководстве вы научитесь перемешивать строки в Dataframe Pandas, используя Python. Вы узнаете, как перемешивать ваш Dataframe Pandas, используя метод sample из Pandas, метод shuffle из sklearn, а также метод permutation из Numpy. Вы также узнаете, почему часто бывает полезно перемешивать данные, как перемешать данные и иметь возможность воссоздавать результаты. Наконец, вы узнаете, какой из методов является самым быстрым.

Перемешивание DataFrame в Pandas — задача, которую часто стоит выполнить перед обучением любой модели машинного обучения. Поскольку наши данные часто отсортированы определенным образом (например, по дате или географической области), мы хотим убедиться, что наши данные представительны. Поэтому мы перемешиваем DataFrame в Pandas перед моделированием.

Поскольку наши модели машинного обучения часто основываются на меньшей выборке данных, мы хотим удостовериться, что выбранные данные представляют истинное распределение наших данных.

Краткий ответ: Используйте метод .sample из Pandas для перемешивания вашего DataFrame

# Перемешивание (shuffling) DataFrame в Pandas с помощью .sample()
shuffled = df.sample(
    frac=1,       # Возвращает весь DataFrame (100% данных) в случайном порядке
    random_state=1 # Делает результат воспроизводимым (фиксирует случайное состояние)
).reset_index()    # Сбрасывает индекс, чтобы он следовал новому порядку строк

# Примечание: метод .shuffle() устарел, вместо него используется .sample(frac=1)

Оглавление

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

В блоке кода ниже представлено несколько строк на Python для генерации примера Pandas Dataframe. Если хотите следовать за этим туториалом шаг за шагом, не стесняйтесь скопировать код ниже, сохраняя порядок. Вы также можете использовать свой собственный Dataframe, но результаты, конечно, будут отличаться от тех, что указаны в туториале.

# Загрузка образец DataFrame Pandas

import pandas as pd

df = pd.DataFrame.from_dict({
    'Name': ['Nik', 'Kate', 'Kevin', 'Evan', 'Jane', 'Kyra', 'Melissa'],
    'Gender': ['Male', 'Female', 'Male', 'Male', 'Female', 'Female', 'Female'],
    'January': [90, 95, 75, 93, 60, 85, 75],
    'February': [95, 95, 75, 65, 50, 85, 100],
})

print(df.head())

# Возвращает:
#     Name  Gender  January  February
# 0    Nik    Male       90        95
# 1   Kate  Female       95        95
# 2  Kevin    Male       75        75
# 3   Evan    Male       93        65
# 4   Jane  Female       60        50

Мы видим, что наш датафрейм содержит четыре столбца: два со строками и два с числовыми значениями.

Перетасовать Pandas Dataframe с образцом

Один из самых простых способов перемешать Dataframe в Pandas — использовать метод sample. Метод df.sample позволяет делать выборку строк в Dataframe в случайном порядке. Благодаря этому, мы можем просто указать, что хотим вернуть весь Dataframe, в случайном порядке.

Чтобы сделать это, мы применяем метод sample к нашему датафрейму и указываем методу вернуть весь датафрейм, передав аргумент frac=1. Это указывает Pandas вернуть 100% датафрейма

Давайте попробуем это в Pandas:

# Перемешивание DataFrame Pandas с использованием .sample()

shuffled = df.sample(frac=1)
print(shuffled)

# Возвращает:
#       Name  Gender  January  February
# 0      Nik    Male       90        95
# 2    Kevin    Male       75        75
# 6  Melissa  Female       75       100
# 1     Kate  Female       95        95
# 3     Evan    Male       93        65
# 4     Jane  Female       60        50
# 5     Kyra  Female       85        85

При применении метода .sample() видно, что данные в DataFrame были перемешаны в случайном порядке. Однако, видим, что исходные значения индекса сохранены. Мы можем сбросить наш индекс, используя метод Pandas .reset_index(), который сбрасывает наш индекс так, чтобы он был отсортирован с 0 и далее. Давайте посмотрим, как это выглядит:

# Перемешивание DataFrame Pandas с использованием .sample()

shuffled = df.sample(frac=1).reset_index()
print(shuffled.head())

# Возвращает:
#       Name  Gender  January  February
# 0      Nik    Male       90        95
# 1    Kevin    Male       75        75
# 2  Melissa  Female       75       100
# 3     Kate  Female       95        95
# 4     Evan    Male       93        65

В следующем разделе вы узнаете, как перемешать DataFrame в Pandas с помощью sample, сохраняя возможность воспроизводить ваши результаты

Воспроизведите ваш перетасованный фрейм данных Pandas

Одним из важных аспектов науки о данных является возможность воспроизводить свои результаты. Когда вы применяете метод sample к датафрейму, он каждый раз возвращает заново перемешанный датафрейм.

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

Почему использовать random_state? Возможность воспроизводить свои результаты – полезное умение в машинном обучении для лучшего понимания вашего рабочего процесса. Это особенно полезно, когда другие проверяют и воспроизводят ваши результаты. Также это очень помогает в правильной отладке вашего кода.

Давайте посмотрим, как это работает:

# Перемешивание DataFrame Pandas с использованием .sample() и фиксированным состоянием случайных чисел

shuffled = df.sample(frac=1, random_state=1).reset_index()
print(shuffled.head())

# Возвращает:
#    index     Name  Gender  January  February
# 0      6  Melissa  Female       75       100
# 1      2    Kevin    Male       75        75
# 2      1     Kate  Female       95        95
# 3      0      Nik    Male       90        95
# 4      4     Jane  Female       60        50

При повторном запуске этого кода мы теперь получаем тот же результат

Перемешайте Pandas Dataframe с помощью функции перемешивания Scikit Learn

Еще один полезный способ рандомизации DataFrame в Pandas заключается в использовании библиотеки машинного обучения sklearn. Одним из основных преимуществ этого подхода является возможность легко интегрировать его в ваши sklearn-пайплайны, что позволяет создавать простые потоки данных.

Sklearn поставляется с методом shuffle, который мы можем применить к нашему датафрейму. Давайте посмотрим:

# Перемешивание DataFrame Pandas с использованием sklearn.utils.shuffle

from sklearn.utils import shuffle

shuffled = shuffle(df)
print(shuffled.head())

# Возвращает:
#       Name  Gender  January  February
# 5     Kyra  Female       85        85
# 1     Kate  Female       95        95
# 4     Jane  Female       60        50
# 0      Nik    Male       90        95
# 6  Melissa  Female       75       100

Аналогично методу .sample из Pandas, если мы хотим воспроизвести наши результаты, мы можем использовать параметр random_state=. Давайте посмотрим, как это выглядит:

# Перемешивание DataFrame Pandas с использованием sklearn.utils.shuffle и фиксированным состоянием случайных чисел

from sklearn.utils import shuffle

shuffled = shuffle(df, random_state=1)
print(shuffled.head())

# Возвращает:
#       Name  Gender  January  February
# 6  Melissa  Female       75       100
# 2    Kevin    Male       75        75
# 1     Kate  Female       95        95
# 0      Nik    Male       90        95
# 4     Jane  Female       60        50

В заключительном разделе ниже вы узнаете, как использовать библиотеку numpy для рандомизации вашего Pandas dataframe

Перетасуйте Pandas Dataframe с помощью random.permutation Numpy

В этом последнем разделе вы узнаете, как использовать NumPy для рандомизации DataFrame в Pandas. NumPy предлагает функцию random.permutation(), которая позволяет нам сгенерировать случайную перестановку массива.

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

# Перемешивание DataFrame Pandas с использованием numpy.random.permutation

from numpy.random import permutation

shuffled = df.iloc[permutation(df.index)]
print(shuffled.head())

# Возвращает:
#       Name  Gender  January  February
# 5     Kyra  Female       85        85
# 2    Kevin    Male       75        75
# 3     Evan    Male       93        65
# 6  Melissa  Female       75       100
# 0      Nik    Male       90        95

Самый быстрый способ перемешать Pandas Dataframe

Возможно, вы задаетесь вопросом, какой метод выбрать. Я бы порекомендовал выбрать тот метод, который лучше всего вписывается в ваш рабочий процесс. Например, если вы строите конвейер анализа данных с помощью sklearn, вы можете встроить перемешивание в ваш конвейер, используя утилиту shuffle из sklearn.

Еще одним важным фактором может быть скорость – какой метод будет стабильно давать самые быстрые результаты.

Чтобы получить приведенные ниже результаты, мы тысячу раз перемешали Pandas DataFrame, содержащий 1 500 000 записей. Среднее значение каждого запуска было вычислено, что позволило получить надежный результат:

Метод
Время для исполнения

df.sample()

18.3 µs ± 255 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)

np.utils.permutation()

17.9 µs ± 122 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)

sklearn.utils.shuffle()

17.9 µs ± 5.53 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)

Результаты довольно близки! Если оптимальная скорость не является вашей главной целью, вы можете спокойно выбрать любой из методов. Тем не менее, вам всё равно придётся импортировать Pandas. Импортирование пакетов, которые вы не используете, может добавить дополнительные задержки в ваш скрипт.

Заключение

В этом уроке вы узнали, как перемешать Dataframe в Pandas, используя метод sample. Метод позволяет случайным образом выбирать строки. Чтобы перемешать наш dataframe, мы просто выбираем весь dataframe. Мы даже можем воспроизвести перемешанный dataframe, используя параметр random_state= .

Вы также научились использовать библиотеки sklearn и numpy для перемешивания вашего датафрейма, что дает вам еще больше гибкости в том, как вы получаете результаты. Например, использование sklearn позволяет легко интегрировать этот шаг в конвейеры машинного обучения.

Чтобы узнать больше о методах, рассмотренных в этом руководстве, ознакомьтесь с официальной документацией:

Похожие статьи

Чтобы узнать больше о связанном контенте, ознакомьтесь со следующими статьями:

  • Pandas Quantile: вычисление процентилей в Dataframe

  • Функция ранжирования Pandas: ранжирование данных Dataframe (эквивалент SQL row_number)

  • Дисперсия Pandas: расчет дисперсии столбца Pandas Dataframe

Last updated