我需要动态更新Spark数据帧中的列。
基本上我需要遍历列列表,如果列已经存在于列表中,则将其重命名为该列及其索引。
我尝试过的代码是这样的:
def dup_cols(df):
for i, icol in enumerate(df.columns):
for x, xcol in enumerate(df.columns):
if icol == xcol and i != x:
df = df.withColumnsRenamed(xcol, xcol + '_' + str(x))
return df
但这会按名称重命名(此处为xcol),因此无法解决我的问题。
我可以更改此设置以通过索引重命名数据框中的列吗?我已经搜了好一会儿,一无所获。
我也无法转换为Pandas数据帧,因此我需要一个Spark / PySpark解决方案来仅通过其索引重命名特定列。
您可以使用pyspark.sql.DataFrame.toDF()重命名列:
返回一个新类:具有新指定列名的DataFrame
这是一个例子:
data = [
(1, 2, 3),
(4, 5, 6),
(7, 8, 9)
]
df = spark.createDataFrame(data, ["a", "b", "a"])
df.printSchema()
根据索引逻辑创建新名称:
new_names = []
counter = {c: -1 for c in df.columns}
for c in df.columns:
new_c = c
counter[c] += 1
new_c += str(counter[c]) if counter[c] else ""
new_names.append(new_c)
print(new_names)
现在用于toDF()创建具有新列名称的新DataFrame:
df = df.toDF(*new_names)
df.printSchema()
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。