我正在尝试从以下位置批量重命名PySpark中的列:
'collect_list(Target_Met_1)[1]' --> 'AB11'
'collect_list(Target_Met_1)[2]' --> 'AB12'
'collect_list(Target_Met_2)[1]' --> 'AB21'
'collect_list(Target_Met_1)[150]' --> 'AB150'
如何以编程方式进行处理?现在,我可以使用以下方式手动更改名称:
df.withColumnRenamed('collect_list(Target_Met_1)[1]', 'AB11')
但是,如果我有500列,则效率不高。我意识到,重命名的另一种方法是使用udf之类的方法,但是我找不到最佳的方法。
我已经拆分了列,这不是问题。问题在于重命名该列。
答案 0 :(得分:0)
没关系。想通了。本质上,我必须使用列表推导来重命名列。我正在拆分上面链接中提到的列。这就是解决问题的方法:
df = df.select('1', '2', '3', *[df[col][i].alias("AB" + str(i + 1) + col) for col in columns for i in range(max_dict[col])])
答案 1 :(得分:0)
要重命名所有列,您可以使用 toDf
方法:
import re
df.toDF(*['AB' + ''.join(re.findall('\d+', i)) for i in df.columns])
答案 2 :(得分:0)
这样的事情也有帮助。这是一个类似于 Pandas 重命名功能的重命名功能。
def rename_cols(map_dict):
"""
Rename a bunch of columns in a data frame
:param map_dict: Dictionary of old column names to new column names
:return: Function for use in transform
"""
def _rename_cols(df):
for old, new in map_dict.items():
df = df.withColumnRenamed(old, new)
return df
return _rename_cols
你可以像这样使用它
spark_df.transform(rename_cols(dict(old1='new1', old2='new2', old3='new3')))