使用清单时如何遮罩?

时间:2019-07-16 18:57:36

标签: python pandas list for-loop mask

我有一个唯一名称列表(准确地说是4,300个)。 unique_names = ['James','Erika','Akshay','Neil'等。] 我在数据框中有一列,每一行都有它自己的名称列表。 我必须从我的unique_names列表中找出此列中的哪些行包含名称。

我尝试过屏蔽,但是每次它只返回2行,而不是所有包含我的列表unique_names中的名称的行。

for name in unique_names: 
    if name in unique_names: 
       mask = df['names'].apply(lambda x: name in x) 
       df1 = df[mask] 

我的预期结果是对于列表中的每个包含唯一名称的行,其唯一列表,但我只返回名称列表中包含名称“ Akshay”的两行,尽管我看到其他行包含名称像“尼尔”和“埃里卡”之类的都不返回。

2 个答案:

答案 0 :(得分:0)

我希望以下内容就足够了。

mask = df['names'].apply(lambda x: any(name in x for name in unique_names))

如果unique_namesset并且每行的名称数很小:

mask = df['names'].apply(lambda x: any(name in unique_names for name in x))

或者:

mask = df['names'].apply(lambda x: not unique_names.isdisjoint(x)))

答案 1 :(得分:0)

我会重新考虑您如何解决此问题。首先,您的原始代码首先对名为unique_names的容器中的名称进行迭代,然后检查其是否在unique_names中。每一次迭代都会通过该测试,因为您是从测试其成员资格的同一容器中提取它们的。

我最好的建议是遍历行而不是名称。伪代码如下:

rows_with_unique = list()
for row in dataframe:
    for name in unique_names:
        if name in row:
          rows_with_unique.append(row) (or whatever you are trying to extract)