在数据框中动态添加列,列名作为 List 中的元素

Posted

技术标签:

【中文标题】在数据框中动态添加列,列名作为 List 中的元素【英文标题】:add columns in dataframes dynamically with column names as elements in List 【发布时间】:2017-03-13 10:26:34 【问题描述】:

我有如下列表[N]

val check = List ("a","b","c","d")

其中 N 可以是任意数量的元素。

我有一个dataframe,只有一个名为“值”的列。根据 value 的内容,我需要创建 N 列,列名作为列表中的元素,列内容为substring(x,y)

我已经尝试了所有可能的方法,例如withColumnselectExpr,但没有任何效果。 请考虑substring(X,Y),其中 X 和 Y 是基于某些元数据的一些数字

以下是我尝试过的不同代码,但没有一个有效,


val df = sqlContext.read.text("xxxxx")
val coder: (String => String) = (arg: String) => 
val param = "NULL"
if (arg.length() > Y )
arg.substring(X,Y)
else
val sqlfunc = udf(coder)
val check = List ("a","b","c","d")
for (name <- check)val testDF2 = df.withColumn(name, sqlfunc(df("value")))

testDF2 只有最后一列 d,其他列如 a,b,c 未添加到表中


var z:Array[String] = new Array[String](check.size)
var i=0
for ( x <- check ) 
if ( (i+1) == check.size) 
z(i) = s""""substring(a.value,X,Y) as $x""""
i = i+1
else
z(i) = s""""substring(a.value,X,Y) as $x","""
i = i+1
val zz = z.mkString(" ")
df.alias("a").selectExpr(s"$zz").show()

这会引发错误


请帮助如何在 DF 中动态添加列,列名作为 List 中的元素

我期待一个像下面这样的 Df

-----------------------------
Value| a | b | c | d | .... N
-----------------------------
|xxx|xxx|xxx|xxx|xxx|xxxxxx-                
|xxx|xxx|xxx|xxx|xxx|xxxxxx- 
|xxx|xxx|xxx|xxx|xxx|xxxxxx-
-----------------------------

【问题讨论】:

请格式化您的问题并显示示例数据以及预期输出。 还是不清楚,原df是什么内容 只有一个名为 value 的列,其中包含一些数据 @mtoto 然后请分享它,并再次清理您的代码。我试着为你做,但还是一团糟。 【参考方案1】:

您可以使用例如this user6910411 对类似问题的回答从列表中动态添加列(有关更多可能性,请参阅她/他的完整答案):

val newDF = check.foldLeft(<yourdf>)((df, name) => df.withColumn(name,<yourUDF>$"value"))

【讨论】:

以上是关于在数据框中动态添加列,列名作为 List 中的元素的主要内容,如果未能解决你的问题,请参考以下文章

如何将命名向量作为行添加到数据框中,根据列名顺序重新排序?

在附加的数据框中添加列名? [复制]

遍历数据框中的列并创建一个列名 + str 的列表

如何使用streamlit和python根据数据框中的字段数添加列

如何在熊猫数据框中插入列名? [复制]

spark数据框中orderBy的列列表