Я хочу отсортировать по группам, но у меня возникли небольшие проблемы с получением именно того, что я хочу, и когда я изучаю "групповуху", я просто задаю больше вопросов.
В любом случае, позвольте мне установить основу. У нас есть этот набор данных:
Name Role Cost Value
0 Johnny Tsunami Driver 1000 39
1 Michael B. Jackson Pistol 2500 46
2 Bobby Zuko Pistol 3000 50
3 Greg Ritcher Lookout 200 25
4 Johnny Tsunami Driver 1000 39
5 Michael B. Jackson Pistol 2500 46
6 Bobby Zuko Pistol 3000 50
7 Appa Derren Lookout 250 30
8 Baby Hitsuo Driver 950 35
9 Michael B. Jackson Pistol 2500 46
10 Bobby Zuko Pistol 3000 50
11 Appa Derren Lookout 250 3
По сути, я хочу, чтобы группы сортировались в порядке убывания по сумме значений в каждой группе и помещались обратно в кадр данных в этом порядке.
Групповое существенное делит каждую группу на 4:
0
Name Role Cost Value
0 Johnny Tsunami Driver 1000 39
1 Michael B. Jackson Pistol 2500 46
2 Bobby Zuko Pistol 3000 50
3 Greg Ritcher Lookout 200 25
Значение: 160
1
Name Role Cost Value
4 Johnny Tsunami Driver 1000 39
5 Michael B. Jackson Pistol 2500 46
6 Bobby Zuko Pistol 3000 50
7 Appa Derren Lookout 250 30
Значение: 165
2
Name Role Cost Value
8 Baby Hitsuo Driver 950 35
9 Michael B. Jackson Pistol 2500 46
10 Bobby Zuko Pistol 3000 50
11 Appa Derren Lookout 250 30
Значение: 161
Это то, что я хочу, чтобы конечный кадр данных был:
4 Johnny Tsunami Driver 1000 39
5 Michael B. Jackson Pistol 2500 46
6 Bobby Zuko Pistol 3000 50
7 Appa Derren Lookout 250 30
8 Baby Hitsuo Driver 950 35
9 Michael B. Jackson Pistol 2500 46
10 Bobby Zuko Pistol 3000 50
11 Appa Derren Lookout 250 30
0 Johnny Tsunami Driver 1000 39
1 Michael B. Jackson Pistol 2500 46
2 Bobby Zuko Pistol 3000 50
3 Greg Ritcher Lookout 200 25
Проблема в том, что… это всего лишь небольшой пример набора данных из 10000 строк. Это работает, когда я сортирую небольшой набор выборок, но когда я сортирую огромный список, сортировка не поддерживает порядок Driver, Pistol, Pistol, Lookout. Он выходит смешанным для каждой группы, как Lookout Pistol Driver Pistol. Я хочу поддерживать порядок ролей после сортировки.
Давайте разбежимся, что я пытался.
Я пробовал:
Пробная сортировка, как показано ниже:
grp = df.groupby(np.arange(len(df.index))//4)
grp[['Value']].transform(sum).sort('Value')
sort1 = df.loc[grp[['Value']].transform(sum).sort_values('Value').index]
Попытался сделать это также с помощью ключа вместо значения.
Создание ключа и сортировка его по ключам:
df['key']=df['Value'].groupby(np.arange(len(df))//4).transform('sum')
df=df.sort_values('key',ascending=False)
Кроме того, я считаю, что сортировка в группе автоматически установлена на true, я играл с включением этого параметра в false, и true все еще не верен.
Это нормально, пока сортировка не произойдет, кажется, что группа поддерживает порядок вплоть до сортировки.
Есть ли способ жестко указать, что я хочу, чтобы порядок сортировки был в точности «Драйвер», «Пистолет», «Пистолет», «Lookout» или, если я могу выяснить порядок, в котором я хочу, чтобы группы были как таковые
gr = df.groupby(np.arange(len(df.index.values))//4)
grp_order = (gr.sum()).sort_values('Value', ascending=False).index
есть ли способ использовать grp_order, чтобы сказать groupby («пока он все еще сгруппирован») переупорядочить себя в кадре данных в соответствии с grp_order, это единственное, что я могу придумать.
Если возможно, можем ли мы избежать циклов, набор данных может увеличиться. Я хочу, чтобы скорость была максимально быстрой. Несколько недель глупо избивал мой мозг, пытаясь понять, в чем я ошибаюсь.