2017-08-29 151 views
1

我的代码在以前的数据集上工作,现在停止工作。我查看了这个错误消息的其他答案,但没有一个适用于我的。Python Pandas索引错误:列表索引超出范围

我在我的数据框df中有一列用于Email_Address,我想将这个域分割成新的列。

我的数据框是以前的df的子集。

#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

这可能意味着,符号'@'没有按不存在于你的一个单元格中,因此你不能访问“@”后面的电子邮件部分。有时用户输入“at”而不是“@”,因此它们不能被机器人追踪。你检查过吗? – ysearka

+1

林不知道,但尝试改变这个'df ['Email_Address'] = df.Email_Address.apply(str)'这个'df ['Email_Address'] = df.Email_Address.astype(str)'也可能你有非在'@'后面的某些行上没有数据会导致数据失败的清理数据。检查一下。没有代表'df'的 –

+1

,不可能重现你的错误。请提供一个[MVCE](https://stackoverflow.com/help/mcve) – C8H10N4O2

回答

3

您的数据框中很可能有无效的电子邮件。 您可以通过使用

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

确定这些你可以用这种方法来提取域

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) 

甚至更​​短:

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

谢谢,我试过这个并得到AttributeError:'系列'对象没有属性'contains' – jeangelj

+0

@jeangelj我修复了这个问题。 (在'contains'之前忘了'str.') –

+0

谢谢,看起来有些令人惊讶的 - 我把它们变成了0 – jeangelj