当前位置: 首页 > 知识库问答 >
问题:

我想通过在pyspark中填充NaN来加入两个DataFrame?

嵇财
2023-03-14

我想在pyspark中以如下方式连接两个数据帧df1:

+-----------+-------------------+-----------------+                 
|         id|      date_start_id|      date_end_id|
+-----------+-------------------+-----------------+
|          1|         2019-01-29|       2019-02-09|          
|          2|         2019-01-29|       2019-02-09|          
|          3|         2019-01-29|       2019-02-09|          
|          4|         2019-01-29|       2019-02-09|          
|          5|         2019-01-29|       2019-02-09|          
|          6|         2019-01-29|       2019-02-09|          
|          7|         2019-01-29|       2019-02-09|          
|          8|         2019-01-29|       2019-02-09|          
|          9|         2019-01-29|       2019-02-09|          
|         10|         2019-01-29|       2019-02-09|          
+-----------+-------------------+-----------------+

df2 看起来像:

+-----------+-------------------+-----------------+-----------+                 
|         id|      date_start_id|      date_end_id|   response|
+-----------+-------------------+-----------------+-----------+
|          2|         2019-01-29|       2019-02-09|          1|
|          3|         2019-01-29|       2019-02-09|          1|
|          5|         2019-01-29|       2019-02-09|          1|
|          7|         2019-01-29|       2019-02-09|          1|
|          8|         2019-01-29|       2019-02-09|          1|
+-----------+-------------------+-----------------+-----------+

我想以这样的方式连接两个数据帧,使其看起来像:

+-----------+-------------------+-----------------+-----------+                 
|         id|      date_start_id|      date_end_id|   response|
+-----------+-------------------+-----------------+-----------+
|          1|         2019-01-29|       2019-02-09|       null|
|          2|         2019-01-29|       2019-02-09|          1|
|          3|         2019-01-29|       2019-02-09|          1|
|          4|         2019-01-29|       2019-02-09|       null|
|          5|         2019-01-29|       2019-02-09|          1|
|          6|         2019-01-29|       2019-02-09|       null|
|          7|         2019-01-29|       2019-02-09|          1|
|          8|         2019-01-29|       2019-02-09|          1|
|          9|         2019-01-29|       2019-02-09|       null|
|         10|         2019-01-29|       2019-02-09|       null|
+-----------+-------------------+-----------------+-----------+

我做了什么:

df = df1.join(df2, ["id","date_start_id","date_end_id"], "left")

但是,不幸的是,这对我来说并不奏效。任何形式的帮助或暗示都将非常感谢。

共有1个答案

庄元龙
2023-03-14

#Pyspark 以 NaN 为值,因此在连接后插入 NaN。我更多地使用 sql 和 spark,因为它很快。

     def dropColumn_sql(df,col_names,spark):
         col_names = [item for item in df.columns if item not in col_names]
         df = df.selectExpr(col_names)
         return df
def join_df_with_NaN(df1, df2, cond, how):
    df = df1.join(df2, cond, how=how) 
    for col in df.columns:
        df = df.selectExpr("*", f""" case when {col} == null then cast('nan' as float) else {col} end as {col+'_temp'}""")
        li = []
        li.append(col)
        df = dropColumn_sql(df, li, spark).withColumnRenamed(col+'_temp', col )
    return df
 类似资料:
  • 问题内容: 我想补的平均相邻元件。 考虑一个数据框: 我想要的输出是: 我研究了其他解决方案,例如包含NaN的Fillcell之前和之后的平均值,但这在连续两个或多个s的情况下不起作用。 任何帮助是极大的赞赏! 问题答案: 使用+除以2: 编辑: 如果包含第一个和最后一个元素,则使用([Dark` 建议):

  • 问题内容: 这应该是程序员经常遇到的问题,但是我从来没有尝试过用这种方式来解决问题。 也就是说,我会解释。说,我需要像这样从表Zoo获取值: 现在,我可以将所有值都添加到列表中。我需要在网格中显示该查询的详细信息。现在已经有了z.predator和z.prey值(它们是时间上的整数,即它们各自的ID),我需要填充其有意义的值以将其显示给最终用户(我不能仅仅显示其ID)。所以现在我可能会做这样的事情

  • null 作者(PK) AuthorName Pubid(PK) pubName 书籍ID(FK) authorid null null 我应该只获得一行查询以获得以上结果。我写的是: 但相反,我得到了许多具有重复数据的行。

  • 我在填充Tableview时遇到问题。当我运行此代码时,我的tableview具有与观察列表相同数量的记录,但什么都不可见。 有什么想法吗?donť理解一些类似cellvalueProperty的东西。这对我的示例有用吗?谢谢

  • 问题内容: 我是Python和Pandas的新手,所以可能有一个我看不到的简单解决方案。 我有一些看起来像这样的不连续数据集: 我现在正在寻找一种解决方案,以实现以下目标: 问题是,A中的间隙因数据集的位置和长度而异… 问题答案: 和是你的朋友。 首先将A列移至索引: 然后使用新索引重新索引,此处使用nans填充缺少的数据。我们使用对象是因为我们可以命名它。这将在下一步中使用。 最后使用将索引移回

  • 我有以下问题,因为我是pyspark的新手。基于来自两列的值的条件,我想填充第三列。条件是: < li >如果分号包含在col2中,请检查col1 < ul > < li >如果col1 == 1,则取分号前的值 < li >如果col1 == 2,则取分号后的值 这就是数据帧的样子。 我创建了下面的udf,它给出了错误“不能将列转换为布尔值:请使用” 我通过谷歌搜索各种功能构建了这个udf,所以