pyspark withColumn,如何改变列名

3htmauhk  于 2023-03-28  发布在  Spark
关注(0)|答案(2)|浏览(149)

有没有办法用pyspark 2.1.0创建/填充列,其中列的名称是不同列的值?我尝试了以下方法

def createNewColumnsFromValues(dataFrame, colName, targetColName):
  """
  Set value of column colName to targetColName's value
  """
  cols = dataFrame.columns
  #df = dataFrame.withColumn(f.col(colName), f.col(targetColName))
  df = dataFrame.withColumn('x', f.col(targetColName))
  return df

out注解行不起作用,当调用方法时我得到错误

TypeError: 'Column' object is not callable

而固定名称(作为字符串)是没有问题的。有没有办法让列的名称也来自另一个,而不仅仅是值?我还尝试使用UDF函数定义作为解决方案,同样没有成功的结果。
多谢帮忙!
编辑:

from pyspark.sql import functions as f
yxyvkwin

yxyvkwin1#

我想出了一个解决方案,它可以很好地扩展少数(或不多)我需要列的不同值。这是必然的情况,否则列的数量会爆炸。

def createNewColumnsFromValues(dataFrame, colName, targetCol):
  distinctValues = dataFrame.select(colName).distinct().collect()
  for value in distinctValues:
    dataFrame = dataFrame.withColumn(str(value[0]), f.when(f.col(colName) == value[0], f.col(targetCol)).otherwise(f.lit(None)))

return dataFrame
gcxthw6b

gcxthw6b2#

你可以尝试以下代码:

test_df = spark.createDataFrame([
    (1,"2",5,1),(3,"4",7,8),              
    ], ("col1","col2","col3","col4"))

def createNewColumnsFromValues(dataFrame, sourceCol, colName, targetCol):
    """
    Set value column colName to targetCol
    """
    for value in sourceCol:
        dataFrame = dataFrame.withColumn(str(value[0]), when(col(colName)==value[0], targetCol).otherwise(None))

    return dataFrame

createNewColumnsFromValues(test_df, test_df.select("col4").collect(), "col4", test_df["col3"]).show()

这里的技巧是执行select("COLUMNNAME").collect()以获得列中的值的列表。然后colName包含此列表,这是一个行列表,其中每一行都有一个元素。所以你可以直接遍历列表并访问位置0处的元素。在这种情况下,转换为string是必要的,以确保新列的列名是字符串。目标列用于每个单独列的值。因此结果如下所示:

+----+----+----+----+----+----+
|col1|col2|col3|col4|   1|   8|
+----+----+----+----+----+----+
|   1|   2|   5|   1|   5|null|
|   3|   4|   7|   8|null|   7|
+----+----+----+----+----+----+

相关问题