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

在 Pandas 中使用查询函数返回位于两个列表交叉处的行

在 Pandas 中使用查询函数返回位于两个列表交叉处的行

吃鸡游戏 2021-09-14 21:04:17
我有这个 df:pd.DataFrame([[1, "type_1"], [2, "type_2"], [2, "type_1; type_2"], [2, "type_1; type_3"], [2, "type_3"], [2, "type_1; type_2, type_3"]],                     columns=["a", "b"])    a   b0   1   type_11   2   type_22   2   type_1; type_23   2   type_1; type_34   2   type_35   2   type_1; type_2, type_3我需要使用从配置文件中获取的大量查询字符串,如下所示:my_list = ["type_1", "type_2"]df.query("a == 2 and b in @my_list")现在输出:    a   b1   2   type_2但我希望输出是这样的,因为 b 中至少有一个值在 my_list 中:    a   b0   2   type_21   2   type_1; type_22   2   type_1; type_33   2   type_1; type_2, type_3如您所见,问题是我的某些列实际上是列表。目前它们是由 分隔的字符串,;但我可以将它们转换为列表。但是,我不确定这将如何帮助我仅使用 .query()从column b内部过滤具有至少一个值的行(因为否则我将不得不解析查询字符串并且它会变得混乱)my_list这将是列表的等效代码:pd.DataFrame([[1, ["type_1"]], [2, ["type_2"]], [2, ["type_1", "type_2"]], [2, ["type_1", "type_3"]], [2, "type_3"], [2, ["type_1", "type_2", "type_3"]]],                     columns=["a", "b"])
查看完整描述

2 回答

?
梦里花落0921

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

其实,我错了。看起来这是“python”引擎支持的。


df.query("a == 2 and b.str.contains('|'.join(@my_list))", engine='python')


   a                       b

1  2                  type_2

2  2          type_1; type_2

3  2          type_1; type_3

5  2  type_1; type_2, type_3

(旧答案)您的查询可以分为两部分:需要子字符串检查的部分和其他所有内容。


您可以分别计算两个掩码。我建议使用str.contains和DataFrame.eval。然后,您可以 AND 掩码和 filter df。


m1 = df.eval("a == 2")

m2 = df['b'].str.contains('|'.join(my_list))


df[m1 & m2]


   a                       b

1  2                  type_2

2  2          type_1; type_2

3  2          type_1; type_3

5  2  type_1; type_2, type_3


查看完整回答
反对 回复 2021-09-14
?
鸿蒙传说

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

您可以使用str.splitbefore 重新创建您的列表,如列并使用isinand any.Noticeisin是完全匹配的,这意味着如果您 hvae type_11,使用isin它会返回False


df[(pd.DataFrame(df.b.str.split(';').tolist()).isin(my_list).any(1))&(df.a==2)]

Out[88]: 

   a                       b

1  2                  type_2

2  2          type_1; type_2

3  2          type_1; type_3

5  2  type_1; type_2, type_3


查看完整回答
反对 回复 2021-09-14
  • 2 回答
  • 0 关注
  • 261 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号