如何检查列表值是否在同时也是列表的列值中

时间:2019-09-18 12:30:50

标签: python-3.x pandas

我有以下数据框:

   name     desc   brand   model
1:  AAA desc_AAA brand_1 model_1
2:  AAA desc_AAA brand_2 model_2
3:  BBB desc_BBB brand_3 model_3

我要检查“名称”列中是否存在“废料”或“机械”。如下所示:

    Name
0   [Scrap]
1   [Machinery, Scrap]
2   [RMG]
3   [Leather]
4   [Machinery]
5   [RMG, Optical Frame, Machinery]

我尝试了以下代码。

Name                                  Type
0   [Scrap]                           True
1   [Machinery, Scrap]                True
2   [RMG]                             False
3   [Leather]                         False
4   [Machinery]                       True
5   [RMG, Optical Frame, Machinery]   True

但是,我得到以下结果:

df['Type'] = df.apply(lambda x: ["Scrap", "Iron","Machinery"] in x["Name"], axis=1)

3 个答案:

答案 0 :(得分:1)

这是使用.apply的一种方法。

例如:

to_check = ("Scrap", "Iron","Machinery") 
df = pd.DataFrame({"Name": [["Scrap"], ["Machinery", "Scrap"], ["RMG"], ["Leather"], ["Machinery"], ["RMG", "Optical Frame", "Machinery"]]})
df['Type'] = df["Name"].apply(lambda x: any(i in x for i in to_check))

print(df)

输出:

                              Name   Type
0                          [Scrap]   True
1               [Machinery, Scrap]   True
2                            [RMG]  False
3                        [Leather]  False
4                      [Machinery]   True
5  [RMG, Optical Frame, Machinery]   True

答案 1 :(得分:0)

您正在检查是否可以找到整个列表,这就是为什么您找不到True的原因。试试

df['Type'] = df.apply(lambda elem: ("Scrap" in elem["Name"]) or ("Machinery" in elem["Name"]), axis=1)

答案 2 :(得分:0)

还可以使用set相交来查看是否存在公共元素。

df['Type'] = df.apply(lambda x: bool( set(["Scrap", "Iron","Machinery"]) & set(x["Name"])  ), axis=1)