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

如何在 python 3.4 tkinter“索引错误:列表索引超出范围”中修复此错误

Python for 循环:“列表索引超出范围”错误?

Python:出现“列表索引超出范围”错误;我知道为啥但不知道如何解决

为啥在使用 readlines() 读取文件时出现列表索引超出范围错误?