为两列(一个多列的)的最高行值排序df,但保留多列基ord

2024-09-26 04:47:11 发布

您现在位置:Python中文网/ 问答频道 /正文

我想按这两个子列中的最高行值对df(picture1)maincolumns(每个maincolumns由两个子列组成)进行排序。我要排序的行是“控球”。我只知道如何对这一行进行排序,但只能直接对子列进行排序(picture2)。但我想保持主列的顺序。 图片3显示了解决方案(“photoshopped”)的外观。你知道吗

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

Tags: thedf排序顺序图片basis解决方案外观
1条回答
网友
1楼 · 发布于 2024-09-26 04:47:11

首先,我的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之后。如果需要的话,你可以调换一下。在任何情况下,首先你需要通过控球获得正确的比赛顺序:

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

nlargest是在每一个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

希望有帮助!你知道吗

相关问题 更多 >