Сортировать df для наибольшего значения строки из двух столбцов (одного многоколоночного), но сохранить базовый порядок многоколоночного - PullRequest
0 голосов
/ 23 сентября 2018

Я хочу отсортировать мои основные столбцы df (изображение 1 ) (каждый основной столбец состоит из 2 вложенных столбцов) по наибольшему значению строки одного из этих двух вложенных столбцов.Строка, которую я хочу отсортировать, это "Ball Possession".Я просто знаю, как отсортировать его для этой строки, но только для вложенных столбцов (рисунок 2 ).Но я хочу сохранить порядок главных колонн. 3 показывает, как должно выглядеть решение («фотошоп»).

[The Basis Dataframe i want to sort][1]
[Sort by subcolumns but not maincolumns][2]
[photoshopped solution][3]

1 Ответ

0 голосов
/ 23 сентября 2018

Итак, для начала мой df5 выглядит так:

>>> df5
           Ball Possession  Result         Team
cat  type
cat0 0                  38       0         PAOK
     2                  62       1      Chelsea
cat1 0                  32       0         PAOK
     2                  68       1      Chelsea
cat2 0                  76       4      Chelsea
     2                  24       1      Cardiff
cat3 0                  78       4      Chelsea
     2                  22       1      Cardiff
cat4 0                  76       2      Chelsea
     2                  24       0  Bournemouth
cat5 0                  70       2      Chelsea
     2                  30       0  Bournemouth
cat6 0                  21       1    Newcastle
     2                  79       2      Chelsea

Я не уверен, был ли ваш фрейм данных после .T или нет.Вы можете переключаться при необходимости.В любом случае сначала нужно получить правильный порядок игр по Ball Possession:

df6 = df5.reset_index().groupby( 'cat' ).apply( lambda df: df.nlargest( 1, 'Ball Possession' ) )

самое старое выбирает большее значение Ball Possession для cat0, cat1, cat2.

df6 выглядит так:

>>> df6
          cat  type  Ball Possession  Result     Team
cat
cat0 1   cat0     2               62       1  Chelsea
cat1 3   cat1     2               68       1  Chelsea
cat2 4   cat2     0               76       4  Chelsea
cat3 6   cat3     0               78       4  Chelsea
cat4 8   cat4     0               76       2  Chelsea
cat5 10  cat5     0               70       2  Chelsea
cat6 13  cat6     2               79       2  Chelsea

, затем завершите

order = df6.sort_values( 'Ball Possession', ascending=False )['cat'].values

, поэтому order просто

>>> order
array(['cat6', 'cat3', 'cat2', 'cat4', 'cat5', 'cat1', 'cat0'], dtype=object)

, а затем используйте этот порядок на исходных данных,сортировка по уровню:

final = df5.reindex( order, level='cat' ).T

, который вам

cat                   cat6              cat3              cat2              cat4                  cat5               cat1           cat0
type                     0        2        0        2        0        2        0            2        0            2     0        2     0        2
Ball Possession         21       79       78       22       76       24       76           24       70           30    32       68    38       62
Result                   1        2        4        1        4        1        2            0        2            0     0        1     0        1
Team             Newcastle  Chelsea  Chelsea  Cardiff  Chelsea  Cardiff  Chelsea  Bournemouth  Chelsea  Bournemouth  PAOK  Chelsea  PAOK  Chelsea

Надеюсь, это поможет!

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