2
votes

Comment puis-je obtenir l'article le plus populaire d'un groupe dans Pandas?

J'ai un cadre de données Pandas contenant des voitures à vendre et j'aimerais obtenir le plus populaire pour chaque marque, mais il me semble impossible de le faire.

J'ai un cadre de données pandas avec quelques colonnes (par exemple: type de véhicule , prix, kilométrage, année, marque, modèle, etc.) et pour chaque marque de voiture, j'aimerais vérifier quel modèle est le plus utilisé. J'ai essayé d'utiliser un groupby, comme ceci:

popular_models = dataset.groupby('brand').model.value_counts().groupby(level=0).nlargest(1)

Mais il renvoie une série Pandas dans laquelle certaines des données que je veux sont stockées dans les index et il ajoute également une colonne répétée qui n'a aucun sens pour moi.

J'aimerais obtenir un DataFrame contenant 3 colonnes, comme ceci:

( https://imgur.com/a/BkKBrv9 )

Cependant, Je reçois une série de pandas comme celle-ci:

( https://imgur.com/a/u8CSXY4 )

Quelqu'un peut-il aidez-moi à comprendre cela?


0 commentaires

3 Réponses :


2
votes

Vous devez regrouper les deux objets que vous souhaitez conserver, puis compter celui dont vous souhaitez rechercher les occurrences. Voici l'exemple de fichier d'entrée:

      Brand     Model  count
0     Chana     Cargo     12
1     Acura       RDX     10
2     Beach      Baby     10
3       BMW      320i      7
5  Cadillac  Escalade      3

Le simple pandas one liner:

groupby_df = (df.groupby(['Brand','Model'])['Model'].agg(['count']).sort_values(by='count', ascending=False).reset_index().drop_duplicates('Brand', keep='first'))

Et la sortie:

                   count
Brand    Model
Acura    RDX          10
BMW      320i          7
         550i          7
Beach    Baby         10
Cadillac Escalade      3
Chana    Cargo        12

Si vous souhaitez trier les valeurs par fréquence (de la plus grande à la plus petite) et ne conserver que la plus grande, changez la ligne unique en:

df = pd.read_table('fun.txt', header=0)
print(df.groupby(['Brand','Model'])['Model'].agg(['count']))

obtenir:

Brand   Model
Acura   RDX
Acura   RDX
Acura   RDX
Acura   RDX
Acura   RDX
Acura   RDX
Acura   RDX
Acura   RDX
Acura   RDX
Acura   RDX
Beach   Baby
Beach   Baby
Beach   Baby
Beach   Baby
Beach   Baby
Beach   Baby
Beach   Baby
Beach   Baby
Beach   Baby
Beach   Baby
BMW     320i
BMW     320i
BMW     320i
BMW     320i
BMW     320i
BMW     320i
BMW     320i
BMW     550i
BMW     550i
BMW     550i
BMW     550i
BMW     550i
BMW     550i
BMW     550i
Cadillac        Escalade
Cadillac        Escalade
Cadillac        Escalade
Chana   Cargo
Chana   Cargo
Chana   Cargo
Chana   Cargo
Chana   Cargo
Chana   Cargo
Chana   Cargo
Chana   Cargo
Chana   Cargo
Chana   Cargo
Chana   Cargo
Chana   Cargo


4 commentaires

Salut, merci pour votre réponse, mais je pense que vous avez oublié d'ajouter le code qui trie les valeurs. Vous venez d'écrire: "Si vous voulez trier les valeurs par fréquence (la plus grande à la plus petite), changez la ligne unique en:" mais vous n'avez jamais montré le code réel. Autre question: comment puis-je conserver uniquement le modèle le plus fréquent pour chaque marque (en supprimant tous les autres)?


Je vais mettre à jour pour montrer comment conserver le modèle le plus fréquent.


a mis à jour la réponse pour montrer comment conserver uniquement le modèle de fréquence la plus élevée par marque.


S'il y a 2 modèles avec le même nombre, il conservera celui qui vient en premier dans le tri



1
votes

Une solution consiste à trier puis à supprimer les doublons après une opération groupby :

df = pd.DataFrame({'Brand': ['B1'] * 5 + ['B2'] * 5,
                   'Model': ['M1', 'M2', 'M1', 'M2', 'M3',
                             'N1', 'N1', 'N2', 'N3', 'N1']})

df['Count'] = df.groupby(['Brand', 'Model'])['Model'].transform('count')

res = df.sort_values('Count', ascending=False)\
        .drop_duplicates('Brand')

print(res)

#   Brand Model  Count
# 5    B2    N1      3
# 0    B1    M1      2

Notez que cela supprime les premiers comptages groupés en double.

p >


0 commentaires

0
votes

Voici une approche.

  1. Configurez l'objet DataFrameGroupBy:

    df.groupby (["Marque", "Modèle"])

  2. Utilisez la fonction GroupBy size pour calculer les tailles de chaque sous-groupe (renvoie comme une série):

    df.groupby (["Brand", "Model"]). size ()

  3. Reconvertissez en DataFrame en nommant la colonne contenant les valeurs calculées par size :

    df.groupby (["Brand", "Model"]). size (). reset_index (name = "Count")

  4. Trier le DataFrame par ordre décroissant selon le Count des éléments du sous-groupe:

    df.groupby (["Marque", "Modèle"]). size (). reset_index (name = "Count"). sort_values ​​(by = "Count", ascending = False)

  5. Supprimez les valeurs Brand en double en conservant la première entrée dans le DataFrame:

    df.groupby (["Marque", "Modèle"]). size (). reset_index (name = "Count"). sort_values ​​(by = "Count", ascending = False) .drop_duplicates (" Marque ", keep =" first ")


0 commentaires