动态列 .withColumn Python DataFrame
Posted
技术标签:
【中文标题】动态列 .withColumn Python DataFrame【英文标题】:Dynamic Columns .withColumn Python DataFrame 【发布时间】:2020-04-21 08:55:59 【问题描述】:我想在我的 Spark DataFrame 上动态应用 .withColumn
,列名在 list
from pyspark.sql.functions import col
from pyspark.sql.types import BooleanType
def get_dtype(dataframe,colname):
return [dtype for name, dtype in dataframe.dtypes if name == colname][0]
def get_matches(dataframe):
return [x for x in dataframe.columns if get_dtype(dataframe,x)=='tinyint']
matches = get_matches(srcpartyaddressDF)
matches
上面的代码给了我列数据类型为'tinyint
'的列列表
结果:
Out[67]: ['verified_flag', 'standard_flag', 'overseas_flag', 'active']
现在我想对列表 matches
中的每一列动态地执行以下操作
partyaddressDF = srcpartyaddressDF.withColumn("verified_flag", col("verified_flag").cast(BooleanType())).withColumn("standard_flag", col("standard_flag").cast(BooleanType())).withColumn("overseas_flag", col("overseas_flag").cast(BooleanType())).withColumn("active", col("active").cast(BooleanType()))
如何在 Python3 中实现这一点
【问题讨论】:
【参考方案1】:你可以这样做:
# import is necessary only for python 3
from functools import reduce
def do_cast(df, cl):
return df.withColumn(cl, col(cl).cast(BooleanType()))
matches = ['verified_flag', 'standard_flag', 'overseas_flag', 'active']
partyaddressDF = reduce(do_cast, matches, srcpartyaddressDF)
基本上,它取初始值(srcpartyaddressDF
),并应用列表中的第一项(列名),然后从列表中取第二个值,并将其与第一次执行时获得的结果一起使用,然后是第三个值。 ..
【讨论】:
以上是关于动态列 .withColumn Python DataFrame的主要内容,如果未能解决你的问题,请参考以下文章
使用 PySpark 中的列表中的 withColumn 函数动态创建新列
如何通过对现有列执行一些转换来使用 withcolumn 添加列?
“withColumn”的 Spark Date 列初始值设定项?