Как перемешать строки 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
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