Python pySpark从列表中添加列
我有一个datafame,希望根据列表中的值向其中添加列Python pySpark从列表中添加列,python,dataframe,apache-spark,pyspark,databricks,Python,Dataframe,Apache Spark,Pyspark,Databricks,我有一个datafame,希望根据列表中的值向其中添加列 mylist = ['ConformedLeaseRecoveryTypeId', 'ConformedLeaseStatusId', 'ConformedLeaseTypeId', 'ConformedLeaseRecoveryTypeName', 'ConformedLeaseStatusName', 'ConformedLeaseTypeName'] 我的值列表将从3-50个值变化。我是pySpark的新手,我正在尝试将这些值作为
mylist = ['ConformedLeaseRecoveryTypeId', 'ConformedLeaseStatusId', 'ConformedLeaseTypeId', 'ConformedLeaseRecoveryTypeName', 'ConformedLeaseStatusName', 'ConformedLeaseTypeName']
我的值列表将从3-50个值变化。我是pySpark的新手,我正在尝试将这些值作为新列(空)附加到我的df中
我已经看到了如何将[1列][1]添加到数据帧而不是列表中的多个数据帧的推荐代码
mylist = ['ConformedLeaseRecoveryTypeId', 'ConformedLeaseStatusId', 'ConformedLeaseTypeId', 'ConformedLeaseRecoveryTypeName', 'ConformedLeaseStatusName', 'ConformedLeaseTypeName']
我下面的代码只附加了一列
for new_col in mylist:
new = datasetMatchedDomains.withColumn(new_col,f.lit(0))
new.show()
[1]: https://stackoverflow.com/questions/48164206/pyspark-adding-a-column-from-a-list-of-values-using-a-udf
您可以在循环中浏览列表,更新df:
for col_name in mylist:
datasetMatchedDomains = datasetMatchedDomains.withColumn(col_name, lit(0))
有趣的后续行动-如果有效,请尝试使用reduce
:)
注意:关于您的编辑-
with column
不是修改原始数据帧,而是每次都返回一个新的数据帧,每次循环迭代都会覆盖该数据帧。我们还可以使用列表理解
和。选择
将新列添加到数据帧中
示例:
#sample dataframe
df.show()
#+---+-----+---+---+----+
#| _1| _2| _3| _4| _5|
#+---+-----+---+---+----+
#| |12343| |9 | 0|
#+---+-----+---+---+----+
mylist = ['ConformedLeaseRecoveryTypeId', 'ConformedLeaseStatusId', 'ConformedLeaseTypeId', 'ConformedLeaseRecoveryTypeName', 'ConformedLeaseStatusName', 'ConformedLeaseTypeName']
cols=[col(col_name) for col_name in df.columns] + [(lit(0)).name( col_name) for col_name in mylist]
#incase if you want to cast new fields then
cols=[col(col_name) for col_name in df.columns] + [(lit(0).cast("string")).name( col_name) for col_name in mylist]
#adding new columns and selecting existing columns
df.select(cols).show()
#+---+-----+---+---+----+----------------------------+----------------------+--------------------+------------------------------+------------------------+----------------------+
#| _1| _2| _3| _4| _5|ConformedLeaseRecoveryTypeId|ConformedLeaseStatusId|ConformedLeaseTypeId|ConformedLeaseRecoveryTypeName|ConformedLeaseStatusName|ConformedLeaseTypeName|
#+---+-----+---+---+----+----------------------------+----------------------+--------------------+------------------------------+------------------------+----------------------+
#| |12343| |9 | 0| 0| 0| 0| 0| 0| 0|
#+---+-----+---+---+----+----------------------------+----------------------+--------------------+------------------------------+------------------------+----------------------+
您建议的代码给了我渴望的输出,谢谢!感谢您在
栏中提供的说明。你对reduce
有什么建议?我的意思是,你可以用稍微功能化一点的风格重写它(尽管这只是一种风格偏好,完全由你决定,不会以任何方式影响性能):你可以尝试做一些类似的事情:functools.reduce(lambda df,col\u name:df.withColumn(col\u name),mylist)
(这里更多的是伪代码,我无法从头开始正确编写)明白了。另一个问题,在重新运行代码几次之后,现在它只将最后一个列表值打印为一列…@Rayan RalI还有另一个问题。我不知道我缺少了什么。@Rayan ral感谢您提供的替代解决方案和解释!我同意这个答案,因为使用with column
只从e列表。@ShuI还有一个问题,提前感谢!@ShuI有一个后续问题,删除链接,提前感谢!@ShuI还有一个问题。我想不出我遗漏了什么。提前感谢!