首页 > 解决方案 > 为两列(一个多列)的最高行值排序df,但保持多列基本顺序

问题描述

我想按这两个子列之一的最高行值对我的 df(图1)主列(每个主列由 2 个子列组成)进行排序。我要对其进行排序的行是“Ball Possession”。我只知道如何为这一行排序,但只对子列直接排序(图2)。但我想保持主列的顺序。图3显示了解决方案(“photoshoped”)的外观。

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

标签: pythonpython-3.xpandasdataframe

解决方案


所以开始,我的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' ) )

nlargest 正在为每个 cat0、cat1、cat2 选择更大的 Ball Possession 值。

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

希望能帮助到你!


推荐阅读