首页 > 解决方案 > 熊猫数据框分组和排序

问题描述

我有一个有 4 列的数据框,其中前两列由字符串(分类变量)组成,最后两列是数字。

Type    Subtype    Price    Quantity
Car     Toyota     10       1
Car     Ford       50       2
Fruit   Banana     50       20
Fruit   Apple      20       5 
Fruit   Kiwi       30       50
Veggie  Pepper     10       20
Veggie  Mushroom   20       10
Veggie  Onion      20       3
Veggie  Beans      10       10  

如何使数据框根据 Type 列上 Price 的聚合总和按降序排序,并且 Subtype 列也按 Price 列的降序排序?像这样:

Type    Subtype    Price    Quantity
Fruit   Banana     50       20
        Kiwi       30       50
        Apple      20       5 
Car     Ford       50       2
        Toyota     10       1
Veggie  Mushroom   20       10
        Onion      20       3
        Beans      10       10  
        Pepper     10       20

我尝试了以下方法,但它没有按降序对 Subtype 列进行排序:

df = df.groupby(['Type','Subtype'])['Price', 'Quantity'].agg({'Price':sum})
i = df.index.get_level_values(0)
df = df.iloc[i.reindex
                   (df['PRICE'].groupby(level=0, 
                   group_keys=False).sum().sort_values('PRICE', ascending=False).index)[1]]
df.columns = df.columns.get_level_values(1)

编辑:子类型下有多个相同的项目,所以我希望类型和子类型列也分组。

标签: pythonpandaspandas-groupby

解决方案


尝试:

df.assign(sortkey = df.groupby('Type')['Price'].transform('sum'))\
  .sort_values(['sortkey','Type','Price'], ascending=[False,True,False])\
  .set_index(['Type','Subtype'])\
  .drop('sortkey', axis=1)

输出:

                 Price  Quantity
Type   Subtype                  
Fruit  Banana       50        20
       Kiwi         30        50
       Apple        20         5
Car    Ford         50         2
       Toyota       10         1
Veggie Mushroom     20        10
       Onion        20         3
       Pepper       10        20
       Beans        10        10

推荐阅读