2017-08-29 2 views
1

Mon code a travaillé sur un jeu de données précédent et a maintenant cessé de fonctionner. J'ai regardé d'autres réponses pour ce message d'erreur, mais aucune ne semble applicable à la mienne.Python Pandas Erreur d'index: Liste Index hors plage

J'ai une colonne dans mon fichier de données df pour Email_Address et je voudrais simplement diviser le domaine en une nouvelle colonne.

Ma base de données est un sous-ensemble d'une df précédente.

#create new df, for only email addresses I need to review 
df = df_raw.loc[df_raw['Review'] == 'Y'].copy() 

#I reset the index to fix the problem, but it didnt help 
df = df.reset_index(drop=True) 

#ensure Email Address is a string 
df['Email_Address']= df.Email_Address.apply(str) 

#make Email Address lower case 
df['email_lowercase'] = df['Email_Address'].str.lower() 

#Split out domain into a new column 
df['domain'] = df['email_lowercase'].apply(lambda x: x.split('@')[1]) 

IndexError: list index out of range 
+2

Cela pourrait signifier que le symbole '@' doesn N'existe pas dans l'une de vos cellules de sorte que vous ne pouvez pas accéder à la partie de l'e-mail qui est 'après' le '@'. Parfois, les utilisateurs tapent 'at' au lieu de' @ ', donc ils ne peuvent pas être tracés par des robots. Avez-vous vérifié pour cela? – ysearka

+1

Je ne suis pas sûr mais essayez de changer ce 'df ['Email_Address'] = df.Email_Address.apply (str)' à ce 'df ['Email_Address'] = df.Email_Address.astype (str)' Il est également possible que vous avez non -clean data où il n'y a pas de données sur certaines lignes après '@' qui provoquerait l'échec. Vérifiez cela aussi. –

+1

sans un représentant «df», il est impossible de reproduire votre erreur. S'il vous plaît fournir un [MVCE] (https://stackoverflow.com/help/mcve) – C8H10N4O2

Répondre

3

Vous avez probablement des e-mails non valides dans votre base de données. Vous pouvez identifier ces en utilisant

df[~df.Email_Address.astype(str).str.contains('@')] 

Vous pouvez utiliser cette approche pour extraire le domaine

def extract_domain(email): 
    email_domain = email.split('@') 
    if len(email_domain) > 1: 
     return email_domain[1] 

df['domain'] = df['email_lowercase'].apply(extract_domain) 

ou encore plus court:

df['domain'] = df['email_lowercase'].str.split('@').apply(lambda li: li[1] if len(li) > 1 else None) 
+0

Merci, j'ai essayé ceci et obtenir AttributeError: objet 'Series' n'a pas d'attribut 'contient' – jeangelj

+0

@jeangelj J'ai corrigé cela. (oublié 'str.' avant' contient') –

+0

Merci, il semble qu'il y ait quelques Nan étonnamment - je les ai faits en 0s – jeangelj