Перемешать строки DataFrame
У меня есть следующий DataFrame:
Col1 Col2 Col3 Type
0 1 2 3 1
1 4 5 6 1
...
20 7 8 9 2
21 10 11 12 2
...
45 13 14 15 3
46 16 17 18 3
...
Этот DataFrame был загружен из CSV файла. Все строки с Type
1 находятся вверху, за ними следуют строки с Type
2, а затем строки с Type
3 и т.д.
Я хотел бы перемешать порядок строк DataFrame, чтобы все Type
были перемешаны. Возможный результат может быть следующим:
Col1 Col2 Col3 Type
0 7 8 9 2
1 13 14 15 3
...
20 1 2 3 1
21 10 11 12 2
...
45 4 5 6 1
46 16 17 18 3
...
Как я могу этого добиться?
5 ответ(ов)
Вы можете просто использовать sklearn
для этого:
from sklearn.utils import shuffle
df = shuffle(df)
Этот код перемешает строки вашего DataFrame df
.
Вы можете перемешать строки DataFrame, используя перемешанный индекс. Для этого вы можете, например, воспользоваться np.random.permutation
(хотя также можно использовать и np.random.choice
):
In [12]: df = pd.read_csv(StringIO(s), sep="\s+")
In [13]: df
Out[13]:
Col1 Col2 Col3 Type
0 1 2 3 1
1 4 5 6 1
20 7 8 9 2
21 10 11 12 2
45 13 14 15 3
46 16 17 18 3
In [14]: df.iloc[np.random.permutation(len(df))]
Out[14]:
Col1 Col2 Col3 Type
46 16 17 18 3
45 13 14 15 3
20 7 8 9 2
0 1 2 3 1
1 4 5 6 1
21 10 11 12 2
Если вы хотите сохранить индексацию с номерами от 1 до n, как в вашем примере, вы можете просто сбросить индекс: df_shuffled.reset_index(drop=True)
(У меня недостаточно репутации, чтобы прокомментировать это на главном посте, поэтому надеюсь, кто-то другой сможет сделать это за меня.) Возникла озабоченность, что первый метод:
df.sample(frac=1)
является глубоким копированием или просто изменяет сам DataFrame. Я выполнил следующий код:
print(hex(id(df)))
print(hex(id(df.sample(frac=1))))
print(hex(id(df.sample(frac=1).reset_index(drop=True))))
Вот результаты:
0x1f8a784d400
0x1f8b9d65e10
0x1f8b9d65b70
Это означает, что метод не возвращает тот же объект, как было предложено в последнем комментарии. Таким образом, этот метод действительно создает перемешанную копию.
Вот один из способов сделать это:
dataframe = dataframe.sample(frac=1, random_state=42).reset_index(drop=True)
где
- frac=1 означает, что будут выбраны все строки из DataFrame;
- random_state=42 позволяет сохранить одинаковый порядок выборки при каждом выполнении кода;
- reset_index(drop=True) предназначено для сброса индекса в рандомизированном DataFrame, при этом старый индекс не сохраняется.
Также полезно, если вы используете это для машинного обучения и хотите всегда разделять одни и те же данные, вы можете использовать:
df.sample(n=len(df), random_state=42)
Это гарантирует, что ваш случайный выбор всегда будет воспроизводимым. Задав значение random_state
, вы фиксируете начальное состояние генератора случайных чисел, что позволяет получать одинаковую выборку при каждом запуске.
Как изменить порядок столбцов в DataFrame?
Изменение типа столбца в pandas
Преобразование списка словарей в DataFrame pandas
Объединение двух столбцов текста в DataFrame pandas
Получить статистику для каждой группы (например, количество, среднее и т.д.) с помощью pandas GroupBy?