8

Перемешать строки DataFrame

7

У меня есть следующий 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 ответ(ов)

3

Вы можете просто использовать sklearn для этого:

from sklearn.utils import shuffle
df = shuffle(df)

Этот код перемешает строки вашего DataFrame df.

0

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

0

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

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

Это означает, что метод не возвращает тот же объект, как было предложено в последнем комментарии. Таким образом, этот метод действительно создает перемешанную копию.

0

Вот один из способов сделать это:

dataframe = dataframe.sample(frac=1, random_state=42).reset_index(drop=True)

где

  • frac=1 означает, что будут выбраны все строки из DataFrame;
  • random_state=42 позволяет сохранить одинаковый порядок выборки при каждом выполнении кода;
  • reset_index(drop=True) предназначено для сброса индекса в рандомизированном DataFrame, при этом старый индекс не сохраняется.
0

Также полезно, если вы используете это для машинного обучения и хотите всегда разделять одни и те же данные, вы можете использовать:

df.sample(n=len(df), random_state=42)

Это гарантирует, что ваш случайный выбор всегда будет воспроизводимым. Задав значение random_state, вы фиксируете начальное состояние генератора случайных чисел, что позволяет получать одинаковую выборку при каждом запуске.

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь