Как я могу переименовать столбец данных PySpark по индексу?(обрабатывать дублированные имена столбцов) - PullRequest
0 голосов
/ 13 декабря 2018

У меня проблема с динамическим обновлением столбцов в кадре данных 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 для переименования определенного столбца только по его индексу.

Спасибо!

1 Ответ

0 голосов
/ 13 декабря 2018

Вы можете использовать pyspark.sql.DataFrame.toDF() для переименования столбцов:

Возвращает новый класс: DataFrame с новыми указанными именами столбцов

Вот пример:

data = [
    (1, 2, 3),
    (4, 5, 6),
    (7, 8, 9)
]

df = spark.createDataFrame(data, ["a", "b", "a"])
df.printSchema()
#root
# |-- a: long (nullable = true)
# |-- b: long (nullable = true)
# |-- a: long (nullable = true)

Создание новых имен на основе вашей логики индекса:

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)
#['a', 'b', 'a1']

Теперь используйте toDF() для создания нового DataFrame сновые имена столбцов:

df = df.toDF(*new_names)
df.printSchema()
#root
# |-- a: long (nullable = true)
# |-- b: long (nullable = true)
# |-- a1: long (nullable = true)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...