Python Pandas 索引错误:列表索引超出范围
Posted
技术标签:
【中文标题】Python Pandas 索引错误:列表索引超出范围【英文标题】:Python Pandas Index error: List Index out of range 【发布时间】:2018-02-07 01:26:37 【问题描述】:我的代码在以前的数据集上工作,现在停止工作。我查看了此错误消息的其他答案,但似乎没有一个适用于我的。
我的数据框 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
【问题讨论】:
这可能意味着符号@
不存在于您的一个单元格中,因此您无法访问电子邮件中位于@
之后的部分。有时用户输入at
而不是@
,这样他们就无法被机器人追踪。你检查过吗?
我不确定,但请尝试将 df['Email_Address']= df.Email_Address.apply(str)
更改为 df['Email_Address']= df.Email_Address.astype(str)
也可能您有非干净数据,其中 @
之后的某些行上没有数据,这会导致它失败.也检查一下。
如果没有代表df
,就不可能重现您的错误。请提供MVCE
【参考方案1】:
您的数据框中很可能包含无效的电子邮件。 您可以通过使用来识别这些
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)
【讨论】:
谢谢,我试过了,得到 AttributeError: 'Series' object has no attribute 'contains' @jeangelj 我解决了这个问题。 (在contains
之前忘记了str.
)
谢谢,好像有一些Nan出人意料——我把它们变成了0s以上是关于Python Pandas 索引错误:列表索引超出范围的主要内容,如果未能解决你的问题,请参考以下文章
IndexError:列表索引超出范围 - python 错误
如何在 python 3.4 tkinter“索引错误:列表索引超出范围”中修复此错误