如果列表包含任何列表返回匹配的字符串

时间:2019-10-18 22:57:30

标签: python pandas

我正在尝试创建一个新列,该列比较两个列表并返回匹配的字符串。

我一直收到错误消息“'列表'对象没有属性'查找'”。

我仍然是一个新手,因此我们将不胜感激!

我正在尝试为此使用python和pandas

到目前为止,我是

raw = pd.read_csv(r"")
brandnames = ['Amana','Maytag']

raw['Brands'] = [k for k in raw['Description'] if brandnames.find(k)]

raw.head()

我希望最终结果中有一个名为Brands的新列,当“描述”列中包含“ Amana”字样时会显示“ Amana”

非常感谢您!

2 个答案:

答案 0 :(得分:0)

我对为什么感到困惑。 find文档明确指出这是一个字符串方法,而不是列表。同样,它返回一个索引。您已经发明了一种find方法,该方法返回布尔值,并且是类list的新元素。

我想你想要的是

[k for k in raw['Description'] if k in brandnames]

更直接地,您可以通过设置交集来实现。将两个名称列表都变成集合,进行交集,然后转换为列表。

list(set(raw['Description']) * set(brandnames))

答案 1 :(得分:0)

列表类型(品牌名称)中没有“ find”方法或属性,因此Python抛出错误。要快速检查类型中的可用属性和方法,可以使用dir(),例如:

>>> x = ['abc', 'def']
>>> dir(x)
['__add__', '__class__', '__contains__', '__delattr__', ...

您可能想要的是in运算符,如Prune的答案。值得考虑的一件事是,in仅在找到完全匹配项时才返回True

>>> brandnames = ['Amana', 'Maytag']
>>> 'Amana' in brandnames
True
>>> 'Amana ' in brandnames
False
>>> 'amana' in brandnames
False
>>> 'Amanaa' in brandnames
False

要考虑的另一件事是,您可能需要对pd.read_csv返回的结果进行其他更改,然后才能在其上使用in运算符。

>>> some_data = "foo bar baz Maytag"
>>> [i for i in some_data.split(' ') if i in brandnames]
['Maytag']

在您程序中的type()上调用raw也许可以,但是如果没有,我建议您看一下Pandas文档。