【问题标题】:Filter one pyspark dataframe using the entries from another dataframe使用来自另一个数据帧的条目过滤一个 pyspark 数据帧
【发布时间】:2021-09-07 12:58:02
【问题描述】:

我有两个数据框,其中一个来自 Category 必须过滤的地方,另一个来自它所做的条件过滤。

Dataframe 1:符合条件的

Earning    Age      House size    Family   ..10 more columns with no values(empty)

Avg        Low       Avg           <Empty>

使用上面的dataframe_1,我必须从满足dataframe_1 中给出的条件的dataframe_2 中过滤Category

Category  Age      House size    Family   Earning   .... more columns
  01      High       Avg          Low      Low
  02      Low        Avg          Avg      Avg
  03      Avg        Avg          High     High

这里的输出将是Category:

02

因为它满足dataframe_1中的所有条件

我知道在 pyspark 中使用 filter 进行过滤的过程,但使用像这样的单个数据框:

dataframe_2.select("category").filter(col("Earning") == 'Avg').filter(col("Age") == 'Low').filter(col("House size") == 'Avg').show()

我的问题是如何使用df_1df_2 中过滤category,给定df_1 中的任何值都可以具有过滤条件并处理空值。任何线索都会有所帮助

【问题讨论】:

  • 您可以收集数据框 1 以获取价值
  • @Vish 你能说明一下你在这里提出的建议吗

标签: apache-spark pyspark apache-spark-sql


【解决方案1】:

你可以通过左连接来实现。

处理空值取决于您的用例。但是,以下是一些关于如何处理它们的想法。

  1. 删除包含空值的记录。
  2. 将 null 替换为特定列最常用的值

以下是示例代码,该代码中没有实现处理空值

>>> df1 = spark.createDataFrame([("Avg", "Low", "Avg")], schema=["Earning", "Age", "House size"])

>>> df1.show()
+-------+---+----------+
|Earning|Age|House size|
+-------+---+----------+
|    Avg|Low|       Avg|
+-------+---+----------+

>>> df2 = spark.createDataFrame([
    ("01", "High", "Avg", "Low", "Low"),
    ("02", "Low", "Avg", "Avg", "Avg"),
    ("03", "Avg", "Avg", "High", "High")
], schema=["Category", "Age", "House size", "Family", "Earning"])

>>> df2.show()
+--------+----+----------+------+-------+
|Category| Age|House size|Family|Earning|
+--------+----+----------+------+-------+
|      01|High|       Avg|   Low|    Low|
|      02| Low|       Avg|   Avg|    Avg|
|      03| Avg|       Avg|  High|   High|
+--------+----+----------+------+-------+

>>> df3 = df1.join(df2, ["Earning", "Age", "House size"], "left")

>>> df3.show()
+-------+---+----------+--------+------+                                        
|Earning|Age|House size|Category|Family|
+-------+---+----------+--------+------+
|    Avg|Low|       Avg|      02|   Avg|
+-------+---+----------+--------+------+

>>> list(df3.select("Category").toPandas()["Category"])
['02']

【讨论】:

  • 这似乎不是一个理想的方式。正如我所说,df1 可以是动态的,过滤器可以在任何列上,所以不能在join 中指定固定的列名。第二点是转换为 pandas 来降低利用并行化前景的前景
猜你喜欢
  • 2020-07-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-19
  • 1970-01-01
  • 2021-12-25
  • 1970-01-01
相关资源
最近更新 更多