6
votes

Groupe de données Pandas et tri

J'ai un dataframe qui a 4 colonnes où les deux premières colonnes sont constituées de chaînes (variable catégorielle) et les deux dernières sont des nombres.

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)

Comment puis-je faire en sorte que le dataframe soit trié par ordre décroissant en fonction de la somme agrégée de Price sur la colonne Type, et que la colonne Subtype soit triée par ordre décroissant pour la colonne Price ainsi que? Comme ceci:

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

J'ai essayé ce qui suit mais cela n'a pas trié la colonne Sous-type par ordre décroissant:

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  

Modifier : Il y a plusieurs éléments sous Sous-type qui sont identiques, je voudrais donc que les colonnes Type et Sous-type soient également regroupées.


2 commentaires

Quelle est la production attendue?


@jezrael Désolé, la sortie attendue est le deuxième dataframe dans mon post ci-dessus.


3 Réponses :


4
votes

Utiliser :

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


2 commentaires

Comment puis-je grouper par sous-type également? J'ai vraiment qu'il y a aussi les mêmes sous-types.


Merci, mais il ne semble pas être trié par type en fonction du prix et non regroupé dans la colonne Sous-type également



5
votes

Essayez :

                 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

Sortie :

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)


2 commentaires

Comment puis-je grouper par sous-type également? J'ai vraiment qu'il y a aussi les mêmes sous-types.


Bien sûr, ajoutez des sous-types dans la méthode sort_values ​​et n'oubliez pas d'ajouter un Vrai ou un Faux à la liste ascendante.



2
votes

Créez un CatégoricalIndex trié par valeurs agrégées avec sum puis sort_values ​​ - dans la dernière version de pandas, il est possible de trier le niveau d'index avec les colonnes ensemble:

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


4 commentaires

Comment puis-je grouper par sous-type également? J'ai vraiment qu'il y a aussi les mêmes sous-types.


@ user112947 - donc besoin de df = df.sort_values ​​(['Type', 'Subtype', 'Price'], ascending = False) ? Ou df = df.sort_values ​​(['Type', 'Subtype', 'Price'], ascending = [False, True, False]) ?


J'obtiens une erreur "KeyError: 'Type'", il semble que Type est un index?


@ user112947 - Problème peut-être de ne pas utiliser la dernière version de pandas