Как удалить столбец из фрейма данных искры по индексу, где имена столбцов могут дублироваться? - PullRequest
0 голосов
/ 23 января 2020

У меня есть искровой фрейм данных, и я хочу удалить только последний столбец.

Я пытался

df.drop(df.columns.last)` 

, но получил ошибку AttributeError: 'list' object has no attribute 'last'.

Я также пытался :

df = df.drop(df.columns[-1])

, но все столбцы с тем же именем, что и в прошлом, были удалены.

Использование Spark 2.4

Ответы [ 2 ]

1 голос
/ 23 января 2020

Вот подход, который вы можете использовать для удаления любого столбца по индексу.

Предположим, у вас был следующий DataFrame:

np.random.seed(1)
data = np.random.randint(0, 10, size=(3,3))

df = spark.createDataFrame(data.astype(int).tolist(), ["a", "b", "a"])
df.show()
#+---+---+---+
#|  a|  b|  a|
#+---+---+---+
#|  5|  8|  9|
#|  5|  0|  0|
#|  1|  7|  6|
#+---+---+---+

Сначала сохраните исходные имена столбцов.

colnames = df.columns
print(colnames)
#['a', 'b', 'a']

Затем переименуйте все столбцы в DataFrame , используя range, чтобы новые имена столбцов были уникальными (они просто будут индексами столбцов).

df = df.toDF(*map(str, range(len(colnames))))
print(df.columns)
#['0', '1', '2']

Теперь удалите последний столбец и переименуйте столбцы, используя имена сохраненных столбцов с первого шага (исключая последний столбец).

df = df.drop(df.columns[-1]).toDF(*colnames[:-1])
df.show()
#+---+---+
#|  a|  b|
#+---+---+
#|  5|  8|
#|  5|  0|
#|  1|  7|
#+---+---+

Вы можете легко расширить это на любой index, так как мы переименовали, используя range.


Я разбил его на шаги для пояснения, но вы также можете сделать это более компактно следующим образом:

colnames = df.columns
df = df.toDF(*map(str, range(len(colnames))))\
    .drop(str(len(colnames)-1))\
    .toDF(*colnames[:-1])
0 голосов
/ 23 января 2020

Лучше оставить столбец по имени. Некоторые операции, такие как withColumn, могут изменить порядок столбцов. Если у фрейма данных есть дубликаты имен, выходящие из объединения, то вместо столбца следует ссылаться на dataframe.column_name, а не на "columnName", что вызывает неоднозначность.

df3 = df1.join(df2, df1.c1 == df2.c1).drop(df2.c1)

В общем df.drop(df.columnName)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...