Поддерживать порядок при сортировке групп, используя альтернативные методы? - PullRequest
0 голосов
/ 09 января 2019

Я хочу отсортировать по группам, но у меня возникли небольшие проблемы с получением именно того, что я хочу, и когда я изучаю "групповуху", я просто задаю больше вопросов. В любом случае, позвольте мне установить основу. У нас есть этот набор данных:

                  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, это единственное, что я могу придумать.

Если возможно, можем ли мы избежать циклов, набор данных может увеличиться. Я хочу, чтобы скорость была максимально быстрой. Несколько недель глупо избивал мой мозг, пытаясь понять, в чем я ошибаюсь.

1 Ответ

0 голосов
/ 09 января 2019

Проблема не в .groupby, поскольку гарантируется сохранение порядка в каждой группе. Этот бит информации скрывается в параметре sort в документации

.

sort: boolean, default True

Сортировка групповых ключей. Получите лучшую производительность, отключив это. Обратите внимание на это не влияет на порядок наблюдений в каждой группе. groupby сохраняет порядок строк в каждой группе.

Поскольку выходные данные не упорядочены по списку драйвера пистолета, ваш базовый DataFrame сортируется не так для каждой группы. Определите другой ключ и выполните сортировку по двум ключам:

df['key'] = df.groupby(df.index.values//4).Value.transform(sum)
df['key2'] = df.Role.map({'Driver': 1, 'Pistol': 2, 'Lookout': 3})

df = df.sort_values(['key', 'key2'], ascending=[False, True])

Выход:

                  Name     Role  Cost  Value  key  key2
4       Johnny_Tsunami   Driver  1000     39  165     1
5   Michael_B._Jackson   Pistol  2500     46  165     2
6           Bobby_Zuko   Pistol  3000     50  165     2
7          Appa_Derren  Lookout   250     30  165     3
8          Baby_Hitsuo   Driver   950     35  161     1
9   Michael_B._Jackson   Pistol  2500     46  161     2
11          Bobby_Zuko   Pistol  3000     50  161     2
10         Appa_Derren  Lookout   250     30  161     3
0       Johnny_Tsunami   Driver  1000     39  160     1
1   Michael_B._Jackson   Pistol  2500     46  160     2
2           Bobby_Zuko   Pistol  3000     50  160     2
3         Greg_Ritcher  Lookout   200     25  160     3

Ввод df:

последние две строки поменялись местами

                  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         Appa_Derren  Lookout   250     30
11          Bobby_Zuko   Pistol  3000     50
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...