当前位置: 首页 > 面试题库 >

数据框上的多条件过滤器

黎玺
2023-03-14
问题内容

谁能向我解释为什么我对这两个表达式会得到不同的结果?我正在尝试在2个日期之间进行过滤:

df.filter("act_date <='2017-04-01'" and "act_date >='2016-10-01'")\
  .select("col1","col2").distinct().count()

结果:37M

df.filter("act_date <='2017-04-01'").filter("act_date >='2016-10-01'")\
  .select("col1","col2").distinct().count()

结果:25M

它们有何不同?在我看来,他们应该产生相同的结果


问题答案:

TL; DR
要传递多个条件filterwhere使用Column对象和逻辑运算符(&|~)。请参见Pyspark:when子句中的多个条件。

df.filter((col("act_date") >= "2016-10-01") & (col("act_date") <= "2017-04-01"))

您还可以使用 单个 SQL字符串:

df.filter("act_date >='2016-10-01' AND act_date <='2017-04-01'")

实际上,在以下两者之间使用更有意义:

df.filter(col("act_date").between("2016-10-01", "2017-04-01"))
df.filter("act_date BETWEEN '2016-10-01' AND '2017-04-01'")

第一种方法甚至不是远程有效的。在Python中,and返回:

  • 如果所有表达式都是“真话”,则为最后一个元素。
  • 否则,第一个“ falsey”元素。

结果是

"act_date <='2017-04-01'" and "act_date >='2016-10-01'"

评估为(任何非空字符串为真):

"act_date >='2016-10-01'"


 类似资料:
  • 问题内容: 我想像这样做一个ElasticSearch查询: 我试图像这样在NEST中实现它: 但这给了我这样的查询,其中的过滤器包装在 布尔值中 : 我应该如何更改我的NEST代码以提供正确的查询?是否必须将我的条款添加到 QueryContainer之外的 其他项目中? 问题答案: 如果要检查条件过滤器,可以在查询之前创建过滤器列表,如下所示: 如果在进行过滤器查询之前不需要检查任何条件,则可

  • 问题内容: 我正在尝试使用Pandas在几个条件下进行布尔索引。我原来的DataFrame称为。如果执行以下操作,将得到预期的结果: 但是,如果我这样做(我认为应该是等效的),则不会返回任何行: 知道导致差异的原因是什么? 问题答案: 使用是因为运算符优先级: 或者,在单独的行上创建条件: 样品 :

  • 问题内容: 要按单列过滤数据帧(df),如果我们考虑男性和女性的数据,则可以: 问题1-但是,如果数据跨越多年并且我只想看2014年的男性,该怎么办? 用其他语言,我可能会做类似的事情: (除了我要执行此操作,并在新的数据框对象中获取原始数据框的子集) 问题2。如何循环执行此操作,并为每个唯一的年份和性别集创建一个数据框对象(例如,2013-男,2013-女,2014-男和2014-女的df 问题

  • 问题内容: 我正在尝试使用三列阈值过滤pandas数据框 但是,我想在一个函数中执行此操作,在字典中将列名及其阈值提供给我。这是我的第一次尝试,可以。本质上,我将过滤器放入变量中,然后运行它: 现在,最后我将所有内容都放到了函数中,并且它停止了工作(也许函数不喜欢在函数中使用!): 我知道函数在函数内部使用时的行为会有所不同,但不确定如何解决该问题。另外,我想知道在给定两个输入的情况下,必须有一种

  • 问题内容: 我正在尝试创建仅在数组 的同一项目 上满足多个条件的情况下与文档匹配的查询/过滤器。 假设这是文档: 我希望能够检索在同一元素上具有N个条件匹配的文档。例如:应该匹配文档,但是不应该匹配。 我正在尝试嵌套布尔过滤器(除此过滤器之外,我还有其他过滤器),但是它不起作用,有些类似于 任何想法如何做到这一点?谢谢 编辑 :我更改了映射,现在嵌套查询根据Val的响应工作。我现在无法在嵌套字段上

  • 我想编写能够使用许多条件来过滤对象列表的代码,但我希望条件的数量波动(有时使用1个字段过滤,有时使用所有3个字段过滤)。 在我的情况下,我希望用户可以为某个字段选择“任何”,但仍然对其他字段应用过滤器。在下面的情况下,用户可以通过字段< code>x,y 我已经编写了下面的代码,可以在这种情况下工作,但在将来添加更多过滤器时效率会越来越低。(2个过滤器导致4个返回语句,3个过滤器导致8个返回语句等