#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. Да, это медленнее, так что я не предпочитаю 😉