web-dev-qa-db-fra.com

Renommer dynamiquement plusieurs colonnes dans PySpark DataFrame

J'ai un dataframe dans pyspark qui a 15 colonnes.

Les noms de colonne sont id, name, emp.dno, emp.sal, state, emp.city, Zip .....

Maintenant, je veux remplacer les noms de colonnes qui ont '.' en eux à '_'

Comme 'emp.dno' à 'emp_dno'

Je voudrais le faire dynamiquement

Comment puis-je y parvenir dans pyspark?

9
User12345

Vous pouvez utiliser quelque chose de similaire à cette excellente solution de @ zero32 :

df.toDF(*(c.replace('.', '_') for c in df.columns))

alternativement:

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])

Le dictionnaire replacement ressemblerait alors à:

{'emp.city': 'emp_city', 'emp.dno': 'emp_dno', 'emp.sal': 'emp_sal'}

MISE À JOUR:

si j'ai un dataframe avec de l'espace dans les noms de colonnes, comment remplacer les deux '.' et espace avec '_'

import re

df.toDF(*(re.sub(r'[\.\s]+', '_', c) for c in df.columns))
20
MaxU

A écrit une fonction facile et rapide à utiliser. Prendre plaisir! :)

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
2
Zilong Z

La façon la plus simple de procéder est la suivante:

Explication:

  1. Récupère toutes les colonnes de la trame de données pyspark à l'aide de df.columns
  2. Créez une liste en boucle dans chaque colonne de l'étape 1
  3. La liste affichera: col ("col.1"). Alias ​​(c.replace ('.', "_"). Ne faites cela que pour les colonnes requises. La fonction Remplacer permet de remplacer n'importe quel modèle. De plus, vous pouvez exclure quelques colonnes d'être renommées
  4. * [liste] décompressera la liste pour l'instruction select dans pypsark

from pyspark.sql import functions as F (df .select(*[F.col(c).alias(c.replace('.',"_")) for c in df.columns]) .toPandas().head() )

J'espère que cela t'aides

0
Naveenan