Python Pandas - уменьшить количество последовательных повторов в одном столбце, сохраняя последовательный порядок в другом - PullRequest
0 голосов
/ 12 июня 2019

У меня есть такой фрейм данных:

a  |  b  |  c
a     1     2
b     1     3
c     1     1
d     2     2
e     2     3
f     2     1

Я бы хотел перемешать строки, чтобы уменьшить количество последовательных повторов в B, при этом располагая их в последовательном порядке в C в максимально возможной степени.Фрейм данных может иметь сотни строк.

Требуемый вывод для указанного выше фрейма данных может выглядеть следующим образом:

a  |  b  |  c
c     1     1
f     2     1
a     1     2
d     2     2
b     1     3
e     2     3

В столбце B нет последовательных дубликатов, а C - этов максимально возможной последовательности на основе строк в кадре данных.C может принимать значения от 1 до 5, в то время как B может иметь много разных значений.

Если критерии больше не могут быть выполнены, и в фрейме данных все еще есть строки, можно поставитьряд (ы) где-нибудь в кадре данных (если это проще).

До сих пор мне был показан способ гарантировать, что последовательные значения не встречаются в B:

np.random.seed(0)
(df.groupby(df.groupby('B').cumcount(), group_keys=False)
   .apply(lambda x: x.sample(frac=1))
   .reset_index(drop=True))

Но мне сложно заставить его включить в код последовательность столбцов C.

Заранее спасибо!

1 Ответ

2 голосов
/ 12 июня 2019

Сортировка по c, а затем b достаточно для вашего примера DataFrame, но она начнет ломаться, как только b примет дублирующиеся значения для данного значения c:

df.sort_values(by=['c', 'b'])
   a  b  c
2  c  1  1
5  f  2  1
0  a  1  2
3  d  2  2
1  b  1  3
4  e  2  3
...