根据包含列表中至少一个元素的列表列进行过滤df(两个列表的交集)。

3

假设我有以下内容:

mylist = ["test", "new"]
df = pd.DataFrame([[["test", "whatever"]], [["tes", "test_in"]], [["new2", "new1"]]], columns=["a"])
df

    a
0   [test, whatever]
1   [tes, test_in]
2   [new2, new1]

我想筛选出只包含mylist中至少一个值的行:

    a
0   [test, whatever]

我无法执行以下代码:

df.query("a.str.contains('|'.join(@mylist))", engine='python')

因为这会导致部分匹配。

我在考虑以下解决方法:

 df[df.apply(lambda x: set(x['a']) & set(mylist), axis=1)]

但这不起作用。

3个回答

3

你已经接近正确了,只需要将空集合转换为 False,其他的都转换为 True

df = df[df['a'].apply(lambda x: bool(set(x) & set(mylist)))]
print (df)
                  a
0  [test, whatever]

最初的回答

替代方案:

df = df[[bool(set(x) & set(mylist)) for x in df['a']]]

或者:

df = df[[bool(set(x).intersection(mylist)) for x in df['a']]]

2

重新创建列表列后,请使用isin进行检查。

最初的回答
df[pd.DataFrame(df.a.tolist()).isin(mylist).any(1)]
Out[23]: 
                  a
0  [test, whatever]

1
这对我有效:

这适用于我:

mylist = ["test", "new"]
df = pd.DataFrame([[["test", "whatever"]], [["tes", "test_in"]], [["new2", "new1"]]], columns=["a"])
print(df)

    def func(x):
        for e in x[0]:
            if(e in mylist):
                return True
            else:
                continue
        return False

    df = df.loc[df.apply(lambda x: func(x), axis=1), :]
    print(df)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接