Pyspark:连接列,其中名称在另一个列中给出
Posted
技术标签:
【中文标题】Pyspark:连接列,其中名称在另一个列中给出【英文标题】:Pyspark : concat columns where the name is given in another one 【发布时间】: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()])))
我哪里错了?
【问题讨论】:
【参考方案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]|
+------------+---------+
【讨论】:
谢谢。我不得不改变你创建垂直数据框的方式,因为我需要更多列,所以我遵循了这个:***.com/a/60212279/1568148,但我遵循你的策略来完成我的数据框。以上是关于Pyspark:连接列,其中名称在另一个列中给出的主要内容,如果未能解决你的问题,请参考以下文章