web-dev-qa-db-ja.com

データフレームの複数条件フィルター

これらの2つの式で異なる結果が得られる理由を誰にでも説明できますか?私は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

それらはどう違いますか ?彼らは同じ結果を生むべきだと思う

15
femibyte

TL; DRfilterまたはwhereに複数の条件を渡すには、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'"
27
zero323

最初の場合

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

結果は2016-10-01を超える値になり、2017-04-01を超えるすべての値も意味します。

一方、2番目のケースでは

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

結果は2016-10-01〜2017-04-01の値です。

0
Ash Man