在PySpark DataFrame中动态重命名多个列

Use*_*345 8 special-characters dataframe apache-spark pyspark

我在pyspark中有一个有15列的数据框.

列名是id,name,emp.dno,emp.sal,state,emp.city,zip.....

现在我想,以取代有列名'.'在他们'_'

'emp.dno''emp_dno'

我想动态地做

我如何在pyspark实现这一目标?

Max*_*axU 20

您可以使用与@ zero323这个伟大解决方案类似的东西:

df.toDF(*(c.replace('.', '_') for c in df.columns))
Run Code Online (Sandbox Code Playgroud)

或者:

from pyspark.sql.functions import col

replacements = {c:c.replace('.','_') for c in df.columns if '.' in c}

df.select([col(c).alias(replacements.get(c, c)) for c in df.columns])
Run Code Online (Sandbox Code Playgroud)

然后replacement字典看起来像:

{'emp.city': 'emp_city', 'emp.dno': 'emp_dno', 'emp.sal': 'emp_sal'}
Run Code Online (Sandbox Code Playgroud)

更新:

如果我在列名中有空格的数据框,那么如何用空格替换'.'空格和空格'_'

import re

df.toDF(*(re.sub(r'[\.\s]+', '_', c) for c in df.columns))
Run Code Online (Sandbox Code Playgroud)


Zil*_*g Z 5

编写了一个简单快速的函数供您使用。享受!:)

def rename_cols(rename_df):
    for column in rename_df.columns:
        new_column = column.replace('.','_')
        rename_df = rename_df.withColumnRenamed(column, new_column)
    return rename_df
Run Code Online (Sandbox Code Playgroud)