Pandas Dataframe Groupby и сортировать - PullRequest
0 голосов
/ 11 февраля 2019

У меня есть фрейм данных, который имеет 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  

Как сделать так, чтобы кадр данных сортировался в порядке убывания на основе агрегированной суммы Price в столбце Type, а столбец 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

Я попробовал следующее, но столбец Подтип не был отсортирован в порядке убывания:

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)

Редактировать: в Подтипе есть несколько одинаковых элементов, поэтомуЯ хотел бы, чтобы столбцы типа и подтипа также были сгруппированы.

Ответы [ 3 ]

0 голосов
/ 11 февраля 2019

Попробуйте:

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
0 голосов
/ 11 февраля 2019

Создать sorted CategoricalIndex по агрегированным значениям с sum, а затем sort_values - в последней версии панд возможна сортировка уровня индекса по столбцам вместе:

df = df.groupby(['Type','Subtype'])[['Price', 'Quantity']].sum()

idx = df['Price'].sum(level=0).sort_values().index

i = pd.CategoricalIndex(df.index.get_level_values(0), ordered=True, categories=idx)
df.index = [i, df.index.get_level_values(1)]

df = df.sort_values(['Type','Price'], ascending=False)
print (df)
                 Price  Quantity
Type   Subtype                  
Fruit  Banana       50        20
       Kiwi         30        50
       Apple        20         5
Veggie Mushroom     20        10
       Onion        20         3
       Beans        10        10
       Pepper       10        20
Car    Ford         50         2
       Toyota       10         1
0 голосов
/ 11 февраля 2019

Использование:

df_new=df.groupby(['Type','Subtype'],as_index=False).apply(\
                  lambda x:x.sort_values(by='Price',ascending=False)).reset_index(drop=True)

df_new.loc[df_new.Type.duplicated(),'Type']= ''
print(df_new)

     Type   Subtype  Price  Quantity
1     Car      Ford     50         2
0            Toyota     10         1
2   Fruit    Banana     50        20
4              Kiwi     30        50
3             Apple     20         5
6  Veggie  Mushroom     20        10
7             Onion     20         3
5            Pepper     10        20
8             Beans     10        10
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...