为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

BIG阳 2021-11-23 16:46:04
说我有:mylist = ["test", "new"]df = pd.DataFrame([[["test", "whatever"]], [["tes", "test_in"]], [["new2", "new1"]]], columns=["a"])df    a0   [test, whatever]1   [tes, test_in]2   [new2, new1]我想过滤并只获取 mylist 中至少有一个值的行:    a0   [test, whatever]我不能这样做: df.query("a.str.contains('|'.join(@mylist))", engine='python') 因为那样我会得到部分匹配。我在想这样的事情: df[df.apply(lambda x: set(x['a']) & set(mylist), axis=1)]但这不起作用。
查看完整描述

3 回答

?
宝慕林4294392

TA贡献2021条经验 获得超8个赞

您很接近,仅将空集的集转换为 bool 到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']]]


查看完整回答
反对 回复 2021-11-23
?
胡子哥哥

TA贡献1825条经验 获得超6个赞

isin重新创建列表列后检查


df[pd.DataFrame(df.a.tolist()).isin(mylist).any(1)]

Out[23]: 

                  a

0  [test, whatever]


查看完整回答
反对 回复 2021-11-23
?
qq_花开花谢_0

TA贡献1835条经验 获得超7个赞

这对我有用:


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)


查看完整回答
反对 回复 2021-11-23
  • 3 回答
  • 0 关注
  • 155 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信