TypeError:列表中列表的预期字符串或类似字节的对象

Posted

技术标签:

【中文标题】TypeError:列表中列表的预期字符串或类似字节的对象【英文标题】:TypeError: expected string or bytes-like object for list in list 【发布时间】:2022-01-21 12:36:57 【问题描述】:

我在数据框的列中有一个列表:

emaildf['email'][0] = ["abc@gmail.com","abc@yahoo.com","abc@abc.com"]

我想遍历每一行(假设 i)并匹配 i 中的对象(假设 j)是否包含子字符串:例如:

for i in emaildf['email']:
    for j in i:
         do_something:

这是我的代码:

Private_Email = []
for index,row in emaildf.iterrows():
    for i in row['email']:
        if len(re.findall("gmail|hotmail|yahoo|msn", row['email'])) > 0:
            Private_Email.append(row['email'])
        else:
            Private_Email.append('No Gmail/Hotmail/MSN/Yahoo domains found.')
emaildf['Private_Email'] = Private_Email

这是我得到的错误:

----> 4 if len(re.findall("gmail|hotmail|yahoo|msn", row['email'])) > 0: TypeError: expected string or bytes-like object

注意: 输入:

re.findall("gmail|hotmail|yahoo|msn", "abc@gmail.com")

输出:

['gmail']

这就是我检查列表长度的原因。

【问题讨论】:

您的意思可能是for j in i 不是for j in in emaildf['email'][i],因为i 是数据,而不是列表索引。 是的,谢谢,改了。 代码中的哪一行现在为您提供TypeError 第 4 行 - 我已经编辑了问题 不知道为什么将这个问题关闭为“需要调试详细信息”,它们位于问题的顶部。请注意,您应该避免在数据帧上使用 re.findall,因为您不使用矢量化 Pandas 函数。 【参考方案1】:

你得到 TypeError:

----> 4         if len(re.findall("gmail|hotmail|yahoo|msn", row['email'])) > 0:

这里是因为row['email'] 是一个列表,而不是一个字符串,所以你不能应用re.findall 它需要一个字符串,而不是一个列表。

现在,您的特定问题似乎可以在不遍历数据帧行的情况下得到解决。试试:

emails = emaildf['email'].explode()
emails = pd.Series(np.where(emails.str.contains("gmail|hotmail|yahoo|msn").replace(np.nan, False), emails, np.nan), index=emails.index)
emails = emails.groupby(emails.index).apply(lambda x: [y for y in x if pd.notna(y)]).apply(lambda x: x if len(x)>1 else (x[0] if len(x)==1 else np.nan))
df['Private_Email'] = np.where(pd.notna(emails), emails, 'No Gmail/Hotmail/MSN/Yahoo domains found.')

【讨论】:

谢谢,我以前试过,对于这一行 - emails[emails.str.contains("gmail|hotmail|yahoo|msn")].groupby(emaildf.index).agg (列表)我收到此错误 - ValueError: Cannot mask with non-boolean array contains NA / NaN values 出现此错误:ValueError: cannot reindex from a duplicate axis. 非常感谢您的帮助 我的数据是这样的:我的数据框名称中有一个列:“email”,并且在该列的每一行中都有一个包含两个或多个电子邮件的列表,我想检查是否该列表中的每个对象都包含“gmail|yahoo|msn|hotmail”。 是的,从我的 df 中的 1703 行开始 - 我有 9 行,该行中有空列表。【参考方案2】:

如果您只是想确保字符串中存在子字符串,则不需要使用正则表达式。

您可以将搜索关键字保留在一个列表中,并使用.apply 遍历email 列内列表中的每个值,并从关键字列表中过滤掉任何不包含任何关键字的值。

查看此 Python 代码:

import pandas as pd
emaildf = pd.DataFrame('email':[["abc@gmail.com","abc@yahoo.com","abc@abc.com"]])
keywords = ["gmail", "hotmail", "yahoo", "msn"]
emaildf['Private_Email'] = emaildf['email'].apply(lambda row: [x for x in row if any(key in x for key in keywords)])
# => >>> emaildf['Private_Email']
#    0    [abc@gmail.com, abc@yahoo.com]
#    Name: Private_Email, dtype: object

.apply(lambda row: [x for x in row if any(key in x for key in keywords)]) 部分迭代 row 值中的每个字符串 (x) 并保留任何 x 字符串(如果其中存在任何 key)。

【讨论】:

以上是关于TypeError:列表中列表的预期字符串或类似字节的对象的主要内容,如果未能解决你的问题,请参考以下文章

TypeError:使用RegEx过滤嵌套字符串列表时的预期字符串或类字节对象

Python 2 - TypeError: int() 参数必须是字符串、类似字节的对象或数字,而不是“列表”

Python TypeError:预期的字符串或缓冲区

TypeError:预期的字符串或类似字节的对象 HashingVectorizer

TypeError: Django中日期范围的预期字符串或类似字节的对象错误。

在抓取网站时,'TypeError:预期的字符串或类似字节的对象'