首页 > 解决方案 > pyspark withColumn,如何改变列名

问题描述

有什么方法可以使用 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

注释掉的行不起作用,调用该方法时出现错误

TypeError: 'Column' object is not callable

而固定名称(作为字符串)没有问题。关于如何使列的名称来自另一个,而不仅仅是值的任何想法?我还尝试使用 UDF 函数定义作为解决方法,但结果相同。

感谢帮助!

编辑:

from pyspark.sql import functions as f

标签: dataframepysparkcolumnname

解决方案


您可能想尝试以下代码:

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 处的元素。在这种情况下,需要强制转换为字符串以确保新列的列名是字符串。目标列用于每个单独列的值。所以结果看起来像:

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

推荐阅读