Перемешивать строки в панде, сохраняя дубликаты - PullRequest
2 голосов
/ 07 марта 2019

У меня есть такие данные:

A  B  C  D  E  F
35 1  2  35 25 65
40 5  7  47 57 67
20 1  8  74 58 63
35 1  2  37 28 69
40 5  7  49 58 69
20 1  8  74 58 63
35 1  2  47 29 79
40 5  7  55 77 87
20 1  8  74 58 63

Здесь мы видим, что столбцы A, B и C имеют реплики, которые повторяются в разных строках. Я хочу перетасовать все строки и получить реплики в последовательных строках, не удаляя ни одного из них. Вывод должен выглядеть так:

A  B  C  D  E  F
35 1  2  35 25 65
35 1  2  37 28 69
35 1  2  47 29 79
40 5  7  47 57 67
40 5  7  49 58 69
40 5  7  55 77 87
20 1  8  74 58 63
20 1  8  74 58 63
20 1  8  74 58 63

Когда я использую pandas.DataFrame.duplicated, это может дать мне дублированные строки. Как сохранить все одинаковые строки, используя groupby?

1 Ответ

2 голосов
/ 08 марта 2019

Вот код, который достигает запрашиваемого вами результата (который не требует явной перестановки или сортировки, а просто группирует ваш существующий df по столбцам A, B, C):

df_shuf = pd.concat( group[1] for group in df.groupby(['A','B','C'], sort=False) )

print(df_shuf.to_string(index=False))

A  B  C   D   E   F
35  1  2  35  25  65
35  1  2  37  28  69
35  1  2  47  29  79
40  5  7  47  57  67
40  5  7  49  58  69
40  5  7  55  77  87
20  1  8  74  58  63
20  1  8  74  58  63
20  1  8  74  58  63

Примечания:

  • Я не мог понять, как сделать df.reindex на месте сгруппированного объекта. Но мы можем обойтись без него.
  • Вам не нужно pandas.DataFrame.duplicated, поскольку df.groupby(['A','B','C'] уже помещает все дубликаты в одну группу.
  • df.groupby(... sort=False) быстрее, используйте его, когда вам не нужны группы, отсортированные по умолчанию.
...