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.
3 Réponses :
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
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
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)
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.
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
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
Quelle est la production attendue?
@jezrael Désolé, la sortie attendue est le deuxième dataframe dans mon post ci-dessus.