0
votes

Créez une nouvelle colonne avec des catégories basées sur la fréquence dans les pandas

J'aurais besoin de créer une nouvelle colonne comme suit:

  • Si la fréquence d'un élément est supérieure ou égale à 5, définissez "Best Seller";
  • Si la fréquence d'un élément est comprise entre 2 (inclus) et 5, définissez "OK";
  • Si la fréquence d'un élément est inférieure à 2, définissez "Bad".

    supposons que mon jeu de données ressemble à xxx

    je voudrais avoir xxx

    i déjà déterminé la fréquence des éléments comme suit: xxx

    Je tiens à vous demander comment créer une nouvelle colonne avec ces valeurs.


4 commentaires

Je pense que je manque une étape. Je devrais associer à chaque article sa fréquence, puis appliquer la condition IF.


Veuillez fournir un exemple de reproductible minimal et clarifier le problème exactement.


@Amc Je pense que j'ai fourni des données pour reproduire l'exemple. J'ai déjà reçu beaucoup de réponses qui m'a aidé.


Je pense que j'ai fourni des données pour reproduire l'exemple. dans un format qui est loin d'être pratique et qui ne fait pas un exemple reproductible. J'ai déjà reçu beaucoup de réponses qui m'a aidé. Je suis heureux d'entendre ça.


6 Réponses :


0
votes

Utiliser groupby code> et transformer code>. Vous devrez également créer une fonction pour classer vos articles:

def categorize(x):
    num = len(x)
    if num >= 5:
        return 'best seller'
    elif num >= 3:
        return 'ok'
    else:
        return 'bad'

df['category'] = df.groupby('Items').transform(categorize)


0 commentaires

2
votes

Vous pouvez utiliser groupy.transform et utilisez np.select xxx


0 commentaires

0
votes

Selon ce que vous avez défini, vous n'avez pas de dépendance de la catégorie à la date (comme supposé par l'OUTPU).

Vous pouvez simplement utiliser Appliquer une fonction sur Axis 1 P>

def testfun(e):
  count = len(df[df["Items"] == e["Items"]])
  if(count>=5):
    return "best seller"
  if(count>=2 and count<5 ):
    return "ok"
  else:
    return "bad"    


df["count"] = df.apply(testfun,axis=1)

1   cintura bad
2   maglietta   best seller
3   maglietta   best seller
4   cappello    ok
5   jeans   best seller
6   cappello    ok
7   maglietta   best seller
8   maglietta   best seller
9   jeans   best seller
10  jeans   best seller
11  maglietta   best seller
12  jeans   best seller
13  jeans   best seller


3 commentaires

df.apply sur l'axe 1 est généralement évité car il est inefficace plus info ici .


@ Ch3ster, ne le savait pas. Génial, votre réponse est plus propre


Heureux d'avoir aidé. @ La réponse de stupidwolf est vraiment sympa tho.



2
votes

Vous pouvez utiliser couper sur valeur_counts:

df['Category'] = cats[df['Items']].to_numpy()

df

    Items       Date        Category
0   calzini     2020/02/23  bad
1   cintura     2020/02/21  bad
2   maglietta   2020/02/23  best seller
3   maglietta   2020/02/22  best seller
4   cappello    2020/02/23  ok
5   jeans       2020/02/23  best seller
6   cappello    2020/02/22  ok
7   maglietta   2020/02/22  best seller
8   maglietta   2020/02/22  best seller
9   jeans       2020/02/22  best seller
10  jeans       2020/02/23  best seller
11  maglietta   2020/02/23  best seller
12  jeans       2020/02/22  best seller
13  jeans       2020/02/23  best seller


5 commentaires

Vraiment belle réponse. +1 df.values ​​ ne doit pas être utilisé mentionné dans le DOCS , remplacez-le par .to_numpy () ou df ['Catégorie'] = DF [" Articles ']. Carte ( chats)


Je vois, n'était pas au courant de ça! Merci de le pointer.


Heureux d'avoir aidé. N'hésitez pas à les ajouter à la réponse, les commentaires peuvent être supprimés. Et merci pour les crédits, en fait, je n'ai rien fait que simplement dire que vous êtes humble, vous n'avez pas besoin de créditer. ;)


Semble très bon, pouvez-vous s'il vous plaît partager la manière dont vous avez choisi des poubelles des conditions 2-5,> 5 et <2? bacs = [0,1,4,10]


@ A.B, c'est la voie à laquelle la pd.cut fonctionne lorsque vous fournissez les pauses, un intervalle est défini comme> LB (limite inférieure) et <= ub (limite supérieure). Donc, pour 2-4, ce sera 1 (2> 1) et 4 (<= 4). Pour> 5, vous avez juste besoin d'une frontière droite supérieure à 5, peut être 10,20. Même chose pour la gauche.



3
votes

Le code ci-dessous devrait fonctionner.

df['category'] = pd.cut(df['sold_items'],bins = [0,1,4,df['sold_items'].max()],labels = ['bad','ok','best seller'])


0 commentaires

0
votes

Vous pouvez également remplacer les valeurs conditionnelles dans valeur_counts , puis mappe : xxx


0 commentaires