dataframe - 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
解决方案
您可能想尝试以下代码:
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|
+----+----+----+----+----+----+
推荐阅读
- android - android motionLayout 的 CustomAttribute - 如何从可绘制资源中指定背景颜色
- html - 如何在css中设置锐利的半圆背景
- java - Signature.verify 抛出异常 Signature length not correct: got 248 but was expected 256
- azure-functions - 在 Azure Function 中接收 Blazor wasm 发送的身份验证令牌
- netflow - 将 netflow v9 存储在时间序列数据库中
- r - 具有未知长度变量列表的 R 函数
- android - 获取响应头
- python - 是否可以在 PyGame 中重置计时器?
- google-apps-script - Google OAuth2 范围 script.external_request 允许访问哪些用户数据?
- r - as.numeric() 为应该是数字的内容生成 NA