python - Pyspark:用字典中的值替换列的值
问题描述
我有一个df
包含 3 列的数据框:
+---+---------+---------+
| 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匹配时,我想将Column_1列中的值替换为字典中key_1的值。
到目前为止,我已经尝试过这段代码。
UDF 获取键的值:
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?
事先谢谢你。
解决方案
我不认为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|
#+---+--------+--------+
推荐阅读
- r - 如何将输入传递到用户定义函数中的命名列表
- reactjs - 如何使用“multiselect-react-dropdown”包自定义“Multiselect”组件中的选择箭头?
- python - 将字典列表转换为 tf 数据集
- r - 在响应变量上运行 boxcox 时出错
- python - 尝试使用 Python 将数据导入 SQL
- python - 自动检测罗德和施瓦茨示波器的 IP 地址
- python - Python & Pandas:循环解析 JSON
- arrays - 如何更改我的突变以接受 ID 数组而不是单个 ID?
- python-3.x - Selenium webdriver 检索一个空列表
- sql - 如何在 SQL 中使用内部连接最小化重复行?