我想按这两个子列之一中的最高行值来排序我的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]
答案 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
希望有帮助!