【发布时间】:2021-11-06 11:54:09
【问题描述】:
我正在处理的 pandas 数据帧对列有一些统一的标签架构,但列的数量是任意的。
例如,下面的 df 包含列 col_names、列的特殊子集以及与这些特殊列对应的过滤条件。它们是通过索引链接的,也可以通过字典链接,任你选择。
col_names = ['col1','col2','col3','xyz.1','xyz.2','xyz.3']
relevant_col_names = ['xyz.1', 'xyz.2', 'xyz.3']
filter_criteria = [something1, something2, something3]
我想获取 'xyz.1' == something1 & 'xyz.2' == something2 & 'xyz.3' ==something3 的子集数据框
我通常会这样做:
whatIwant = df.loc[df['xyz.1']==something1 & df['xyz.2']==something2 & df['xyz.3']==something3]
问题是我需要能够为任意数量的“xyz”列编写该表达式,而无需手动编写上述表达式。
例如,如果 df 恰好有 5 个相关列,如下所示:
['col1','col2','col3','xyz.1','xyz.2','xyz.3','xyz.4','xyz.5']
然后我需要自动写这样的东西:
whatIwant = df.loc[df['xyz.1']==something1 & df['xyz.2']==something2 & df['xyz.3']==something3 & df['xyz.4']==something4 & df['xyz.5']==something5]
有没有办法根据列表或字典(或其他东西)编写任意长度的布尔表达式,我在其中对其中的所有内容进行与运算?
我不知道如何用谷歌来表达这个问题。它似乎与列表和字典理解、表达式合成或其他东西有关。即使知道表达这个问题的正确方法,如何为stackoverflow标记这个问题,和/或我应该谷歌什么,也会很有帮助。谢谢!
【问题讨论】:
-
主要问题在我看来是“某事*”。这些是单个变量(坏)还是列表中的项目(好)还是其他什么?
-
您想要应用所有过滤器吗?您是否尝试循环应用过滤器,将每个过滤器应用于上一步的过滤结果?
-
@MichaelButscher 是的,所有“somethingK”都在一个列表中,索引方式与相应的“xyz.K”组件相同
-
@KarlKnechtel 是的,我希望所有过滤器同时应用,因此需要一个长布尔表达式。这是一个聪明的想法,这是有道理的。当我应用每个过滤器时,只需制作一个逐渐变小的数据框。尽管大 O 效率似乎很痛苦。但是很实用。谢谢
-
因为数据框会逐渐变小,因此您不会遇到大 O 复杂性问题。你实际上是在做同样的短路。
标签: python pandas list-comprehension boolean-expression dictionary-comprehension