Pyspark:用字典中的值替换列的值

Posted

技术标签:

【中文标题】Pyspark:用字典中的值替换列的值【英文标题】:Pyspark: Replace value of a column with a value in the dictionary 【发布时间】:2021-08-26 11:29:34 【问题描述】:

我有一个包含 3 列的数据框 df

+---+---------+---------+
| Id| Column_1| Column_2|
+---+---------+---------+
| 11|c1_value1|c2_value1|
| 22|c1_value2|c2_value2|

还有字典列表 - data_list

[
'id': '11', 'key_1': 123, 'key_2': 456
'id': '22', 'key_1': 789, 'key_2': 123
]

当数据框中的Id和id匹配。

到目前为止,我已经尝试过这段代码。

UDF获取key的值:

def return_col(id):
    for item in data_list:
        if item['id'] == id:
            return item['key_1']

return_col_UDF = udf(lambda z: return_lat(z))

在数据帧上调用 UDF:

df.select(col('Id'), \
    return_col_udf(col('Id')).alias('Updated_Column')) \
    .show()

但它只替换了 1 列的值。如何更改 2 列的值:Column_1 和 Column_2?

先谢谢你。

【问题讨论】:

【参考方案1】:

我认为不需要udf,因为你有dictionary,所以将dict 转换为数据框,然后加入现有的数据框。

Example:

#load dict_list as dataframe
df1=spark.createDataFrame(['id': '11', 'key_1': 123, 'key_2': 456,'id': '22', 'key_1': 789, 'key_2': 123])
df1.show()
#+---+-----+-----+
#| id|key_1|key_2|
#+---+-----+-----+
#| 11|  123|  456|
#| 22|  789|  123|
#+---+-----+-----+


df.show()
#+---+--------+--------+
#| Id|column_1|column_2|
#+---+--------+--------+
#| 11|      c1|      c2|
#| 22|      c1|      c2|
#+---+--------+--------+

df.join(df1,['id']).\
withColumn("column_1",col("key_1")).\
withColumn("column_2",col("key_2")).\
drop(*['key_1','key_2']).\
show()
#+---+--------+--------+
#| Id|column_1|column_2|
#+---+--------+--------+
#| 22|     789|     123|
#| 11|     123|     456|
#+---+--------+--------+

【讨论】:

知道了,我试试! data_list 实际上包含有 6 个键(不是 3 个)的字典。在将列表转换为数据框之前,我定义了列名:list_columns = ['id', 'key_1', .... ] 并在此 df_list 中创建了一个数据框:df_list = session.createDataFrame(data = data_list, schema = list_columns),id 列显示第 4 列的值,最后一列显示 id 列的值。我不明白为什么列名正确但值混淆(错误顺序) 用示例数据更新问题,将研究问题!

以上是关于Pyspark:用字典中的值替换列的值的主要内容,如果未能解决你的问题,请参考以下文章

用列表 Pyspark Dataframe 中的值替换 NA

如何从 PySpark 中的多个列创建字典列表,其中键是列名,值是该列的值?

用字典替换熊猫系列中的值

用映射字典的值替换嵌套字典中的占位符

如何将字典中的值映射到 Pyspark 中的新列

NSPredicates 可以用来用字典中的值替换数组中的对象吗?