对df排序以获得两列(一个多列)的最高行值,但保持多列基本顺序

时间:2018-09-23 15:13:59

标签: python python-3.x pandas dataframe

我想按这两个子列之一中的最高行值来排序我的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]

1 个答案:

答案 0 :(得分:0)

因此,我的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' ) )

最大的是每个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

希望有帮助!