1
votes

créer une nouvelle colonne de catégorie en utilisant la chaîne pandas contient et boucle

J'ai un bloc de données qui ressemble à ceci:

  File "<ipython-input-29-d9457f9cb172>", line 6
    else df.Title[i].str.contains("Manager"):
          ^
SyntaxError: invalid syntax

Je veux parcourir le bloc de données et en utilisant df.str.contains créer une autre colonne qui catégorisera ces emplois. Il y a 8 catégories.

Le résultat sera:

for i in range(len(df)):
    if   df.Title[i].str.contains("Support"):
            df.category[i]=="Support"
    elif df.Title[i].str.contains("designer"):
            df.category[i]=="Design"
    else df.Title[i].str.contains("Manager"):
            df.category[i]=="Management"

voici ce que j'ai essayé jusqu'à présent:

name              Title             category
abc           'Tech support'         'Support' 
xyz           'UX designer'          'Design'
ghj           'Manager IT'           'Management'
...              ....              ....


2 commentaires

else doit également être un elif


la syntaxe correcte de Python est elif: et else: . Vous avez oublié : .


4 Réponses :


1
votes

Syntaxe générale de python if instruction est:

else:
    df.category[i]=="Others"

Comme vous pouvez le voir dans la syntaxe, pour évaluer une expression de test , elle doit être dans le if ou dans la construction elif . Le code renvoie l'erreur de syntaxe lorsque l'expression de test est placée dans la construction else . Pensez à changer le dernier else en elif et ajoutez un cas de secours pour l'erreur comme:

if test expression:
     Body of if
elif test expression:
     Body of elif
else: 
     Body of else


0 commentaires

2
votes

Vous pouvez faire quelque chose comme ceci:

cat_dict = {"Support":"Support", "designer":"Designer", "Manager": "Management"}

df['category'] = (df['Title'].str.extract(fr"\b({'|'.join(cat_dict.keys())})\b")[0]
                    .map(cat_dict)
                 )


2 commentaires

Cette implémentation peut-elle être sensible à la casse? c'est-à-dire que le Support technique et le support technique seront classés comme Support sans ajouter un autre élément au dictionnaire.


@DevarshiGoswami oui, il suffit de passer re.IGNORECASE à extract , c'est-à-dire .str.extract ("...", re.IGNORECASE) .



1
votes

Cette réponse: Itérer les lignes et changer la valeur devrait vous aider!

Lmk, si vous avez d'autres questions!


0 commentaires

1
votes

Voilà:

  name         Title    Category
0  abc  Tech support     Support
1  xyz   UX designer      Design
2  ghj    Manager IT  Management

Résultat:

import pandas as pd
from io import StringIO

df = pd.read_csv(StringIO("""
name             Title
abc          Tech support
xyz          UX designer
ghj          Manager IT
"""), sep='\s{2,}', engine='python')

masks = [df.Title.str.lower().str.contains('support'),
    df.Title.str.lower().str.contains('designer'),
    df.Title.str.lower().str.contains('manager')
]

values = [
    'Support',
    'Design',
    'Management'
]

import numpy as np

df['Category'] = np.select(masks, values, default='Unknown')
print(df)


3 commentaires

J'obtiens cette erreur si j'utilise votre extrait. TypeError: entrée invalide 0 dans condlist: doit être booléen ndarray à la ligne df ['Category'] = np.select (masks, values, default = 'Unknown')


@DevarshiGoswami Ajout du code complet. Pourriez-vous s'il vous plaît vérifier?


Merci, je vais jeter un œil. :RÉ