À l'origine, ma question était:

J'ai des dataframe par exemple:

df = pd.DataFrame({
                "EmailAdds": ["pamelasilvera@gmail.com"],
                "Subject": ["Report submission", "Meeting update"]
            })

Je voulais séparer les identifiants de messagerie dans la colonne "EmailAdds" en fonction de "@" et avoir à ajouter des colonnes ayant l'identifiant de messagerie racine et le nom de domaine. Le dataframe final était censé ressembler à ceci:

df = pd.DataFrame({
                    "EmailAdds": ["pamelasilvera@gmail.com"],
                    "Subject": ["Report submission", "Meeting update"]
                })

Plus tard, j'ai réalisé que la colonne "EmailAdds" peut avoir plusieurs e-mails dans une ligne de données séparés par ";". En fait, mon dataframe ressemble à ceci:

df = pd.DataFrame({
            "EmailAdds": ["pamelasilvera@gmail.com; adarandall@gmail.com; larryjacob@orange.com", "indiejesse.d@gmail.com"],
            "Subject": ["Report submission", "Meeting update"]
        })

Ce que je veux vraiment faire, c'est:

Je veux parcourir chaque élément de "EmailAdds" et d'abord séparer les e-mails en utilisant ';' puis séparez chaque adresse e-mail en utilisant @ en sous-chaînes puis ajoutez d'abord 2 colonnes supplémentaires "EmailAdd_roots" contenant les sous-chaînes des adresses e-mail de cette ligne, disons "pamelasilvera adarandall larryjacob" et la seconde "EmailAdd_domains" contenant des noms de domaine uniques sans " .com "disons" gmail orange ".

Le dataframe résultant doit ressembler exactement à ceci:

df = pd.DataFrame({
                "EmailAdds": ["pamelasilvera@gmail.com; adarandall@gmail.com; larryjacob@orange.com", "indiejesse.d@gmail.com"],
                "Subject": ["Report submission", "Meeting update"],
                "EmailAdds_roots": ["pamelasilvera adarandall larryjacob", "indiejesse"],
                "EmailAdds_domains":["gmail orange", "gmail"]
            })
0
Indy 4 juin 2020 à 18:35

3 réponses

Meilleure réponse

Voici une bouchée:

emails = df['EmailAdds'].str.split(';').explode()
df = df.join(
         emails.str.split('@', expand=True) \
         .fillna('') \
         .groupby(level=0) \
         .agg(
             { 0: ' '.join,
               1: lambda x: ' '.join(set(x))}
         ).rename(columns=['EmailAdds_roots', 'EmailAdds_domains'].__getitem__)
     )

Résultats:

          EmailAdds            Subject  \
0  pamelasilvera@gmail.com; adarandall@gmail.com;...  Report submission   
1                             indiejesse.d@gmail.com     Meeting update   

                         EmailAdds_roots     EmailAdds_domains  
0  pamelasilvera  adarandall  larryjacob  gmail.com orange.com  
1                           indiejesse.d             gmail.com  

Une version alternative plus lisible serait:

emails = df['EmailAdds'].str.split(';').explode() \
            .str.split('@', expand=True).fillna('') \
            .groupby(level=0)
df['EmailAdds_roots'] = emails[0].agg(list).str.join(' ')
df['EmailAdds_domains'] = emails[1].unique().str.join(' ')
1
r.ook 4 juin 2020 à 18:34

Nous faisons join avec str.split

df=df.join(df.EmailAdd.str.split('@',expand=True))
Out[138]: 
                  EmailAdd            Subject              0          1
0  pamelasilvera@gmail.com  Report submission  pamelasilvera  gmail.com
1   indiejesse.d@gmail.com     Meeting update   indiejesse.d  gmail.com
2
YOBEN_S 4 juin 2020 à 15:39

Nous pouvons également utiliser str.extract avec un groupe d'expression régulière nommé:

df.join(df.EmailAdd.str.extract('^(?P<Email>[^@]+)@(?P<Domain>.+)'))

Production:

                  EmailAdd            Subject          Email     Domain
0  pamelasilvera@gmail.com  Report submission  pamelasilvera  gmail.com
1   indiejesse.d@gmail.com     Meeting update   indiejesse.d  gmail.com
0
Quang Hoang 4 juin 2020 à 15:48