Упорядочивайте по 5 элементов за раз в столбце в соответствии с их лексикографическим порядком

#python-3.x #pandas #dataframe

Вопрос:

В общем, я хочу заказать столбец для каждой группы из 5 элементов одновременно. У меня есть фрейм данных, подобный этому:

 Col1 Col2  Col3
1    data   abcd
2    data2  cda
3    data3  dcv
4    data4  cvda
5    data5  b
6    data6  abcd
7    data7  dcv
8    data8  cda
9    data9  cvda
10   data10 b
 

Я бы сделал что-то вроде этого:

 Col1 Col2  Col3
1    data   abcd
2    data5  b 
3    data2  cda 
4    data4  cvda
5    data3  dcv
6    data6  abcd
7    data10 b
8    data8  cda
9    data9  cvda
10   data7  dcv
 

Я хочу, чтобы для каждой группы из 5 элементов в col3 был их лексикографический порядок.
Как я могу получить этот результат?

Ответ №1:

Быстрее groupby с sort_values решением является сортировка по 2 столбцам, вот еще один столбец, созданный путем целочисленного деления на 5 :

 a = np.arange(len(df))
df = (df.assign(new = a // 5)
        .sort_values(['new','Col3'], ignore_index=True)
        .drop('new', axis=1)
        .assign(Col1 = a   1))
print (df)
   Col1    Col2  Col3
0     1    data  abcd
1     2   data5     b
2     3   data2   cda
3     4   data4  cvda
4     5   data3   dcv
5     6   data6  abcd
6     7  data10     b
7     8   data8   cda
8     9   data9  cvda
9    10   data7   dcv
 

Ответ №2:

Другая версия:

 print(
    df.groupby(df.index // 5)
    .apply(lambda x: x.sort_values("Col3"))
    .reset_index(drop=True)
)
 

С принтами:

    Col1    Col2  Col3
0     1    data  abcd
1     5   data5     b
2     2   data2   cda
3     4   data4  cvda
4     3   data3   dcv
5     6   data6  abcd
6    10  data10     b
7     8   data8   cda
8     9   data9  cvda
9     7   data7   dcv
 

Комментарии:

1. Да, это медленнее, так что я не предпочитаю 😉