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

说我有:


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)]

但这不起作用。


BIG阳
浏览 156回答 3
3回答

宝慕林4294392

您很接近,仅将空集的集转换为 bool 到False,否则True:df = df[df['a'].apply(lambda x: bool(set(x) & set(mylist)))]print (df)                  a0  [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']]]

胡子哥哥

isin重新创建列表列后检查df[pd.DataFrame(df.a.tolist()).isin(mylist).any(1)]Out[23]:                   a0  [test, whatever]

qq_花开花谢_0

这对我有用: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)
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python