Сортировка по заказу + одно условие в пандах - PullRequest
0 голосов
/ 31 октября 2019

Есть ли какой-нибудь способ в пандах достичь такого типа сортировки?

Это пример того, что я получу с df = df.sort_values(['Name'])

 Name                           ID
|Retailer|Lidl                  282
|Retailer|Lidl Kaufland         256
|Retailer|Lidl Kaufland|Hamburg 268
|Retailer|Lidl|Hamburg          287

, когда требуемый результат должен быть

 Name                           ID
|Retailer|Lidl                  282
|Retailer|Lidl|Hamburg          287
|Retailer|Lidl Kaufland         256
|Retailer|Lidl Kaufland|Hamburg 268

Как видите, даже добавление идентификатора в sort_values ​​не поможет, так как значения возрастают только после первой сортировки.

Это какая-то иерархия, где родительский элемент находится сверхупотом детское дно.

|Retailer|Lidl = parent 
|Retailer|Lidl|Hamburg = child
|Retailer|Lidl Kaufland = parent
|Retailer|Lidl Kaufland|Hamburg = child

1 Ответ

2 голосов
/ 31 октября 2019

IIUC, вы можете использовать кортеж для сортировки, например, как упомянуто @jezrael:

result = df.iloc[df.Name.str.split('|').map(tuple).argsort()]

В качестве альтернативы:

df['order'] = df.Name.str.split('|').map(tuple)

result = df.sort_values('order').drop('order', axis=1)
print(result)

Вывод

                             Name   ID
0                   |Retailer|Lidl  282
3           |Retailer|Lidl|Hamburg  287
1          |Retailer|Lidl Kaufland  256
2  |Retailer|Lidl Kaufland|Hamburg  268

Это гарантирует, что родители всегда будут на первом месте после детей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...