【问题标题】:Pyspark : concat columns where the name is given in another onePyspark:连接列,其中名称在另一个列中给出
【发布时间】:2022-01-07 06:29:52
【问题描述】:

我有 2 个数据框

df1= 
+--------------+
|questions     |
+--------------+
|[Q1, Q2]      |
|[Q4, Q6, Q7]  |
|...           |
+---+----------+

df2 = 
+--------------------+---+---+---+---+
| Q1| Q2| Q3| Q4| Q6| Q7 | ...   |Q25|
+--------------------+---+---+---+---+
|  1|  0|  1|  0|  0| 1  | ...   |  1|
+--------------------+---+---+---+---+

我想在第一个数据框中添加一个新列,其中所有列的值都定义为df1.questions

预期结果

df1 = 
+--------------++--------------+
|questions     |values
+--------------+---------------+
|[Q1, Q2]      |[1, 0]         |
|[Q4, Q6, Q7]  |[0, 0, 1]      |
|...           |               |
+---+----------++--------------+
 

当我这样做时

 cols_to_link = ['Q1', 'Q2']
 df2= df2.select([col for col in cols_to_link])\
 df2 = df2.withColumn('value', F.concat_ws(", ", *df2.columns))

附加列是我想要的,但我不能通过混合数据框来做到这一点

当我使用 df2 时它也有效

 df2 = df2.select([col for col in df1.select('questions').collect()[0][0]])\
 df2 = df2.withColumn('value', F.concat_ws(", ", *df2.columns))

但不是当我想从 df1 出发时

 df1= df1\
    .withColumn('value', F.concat_ws(", ", *df2.select([col for col in df1.select('questions').collect()])))

我哪里错了?

【问题讨论】:

    标签: python pyspark concatenation


    【解决方案1】:

    从我的示例数据框,

    # df1
    +------------+
    |   questions|
    +------------+
    |    [Q1, Q2]|
    |[Q4, Q6, Q7]|
    +------------+
    
    # df2
    +---+---+---+---+---+---+
    | Q1| Q2| Q3| Q4| Q6| Q7|
    +---+---+---+---+---+---+
    |  1|  0|  1|  0|  0|  1|
    +---+---+---+---+---+---+
    

    我已经创建了垂直数据框并加入。一般来说,您不能引用其他数据框中的列。

    cols = df2.columns
    df = df2.rdd.flatMap(lambda row: [[cols[i], row[i]] for i in range(0, len(row))]).toDF(['id', 'values'])
    df.show()
    
    +---+------+
    | id|values|
    +---+------+
    | Q1|     1|
    | Q2|     0|
    | Q3|     1|
    | Q4|     0|
    | Q6|     0|
    | Q7|     1|
    +---+------+
    
    df1.join(df, f.expr('array_contains(questions, id)'), 'left') \
      .groupBy('questions').agg(f.collect_list('values').alias('values')) \
      .show()
    
    +------------+---------+
    |   questions|   values|
    +------------+---------+
    |    [Q1, Q2]|   [1, 0]|
    |[Q4, Q6, Q7]|[0, 0, 1]|
    +------------+---------+
    

    【讨论】:

    • 谢谢。我不得不改变你创建垂直数据框的方式,因为我需要更多列,所以我遵循了这个:stackoverflow.com/a/60212279/1568148,但我遵循你的策略来完成我的数据框。
    猜你喜欢
    • 2018-12-25
    • 2021-12-07
    • 2018-06-09
    • 1970-01-01
    • 1970-01-01
    • 2023-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多