动态列 .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 函数动态创建新列

在多列上使用 df.withColumn()

如何通过对现有列执行一些转换来使用 withcolumn 添加列?

“withColumn”的 Spark Date 列初始值设定项?

在 Pyspark 中的多个列上使用相同的函数重复调用 withColumn()

Scala withColumn新建NULL列