Подтвердить что ты не робот

Как удалить столбцы в pyspark dataframe

>>> a
DataFrame[id: bigint, julian_date: string, user_id: bigint]
>>> b
DataFrame[id: bigint, quan_created_money: decimal(10,0), quan_created_cnt: bigint]
>>> a.join(b, a.id==b.id, 'outer')
DataFrame[id: bigint, julian_date: string, user_id: bigint, id: bigint, quan_created_money: decimal(10,0), quan_created_cnt: bigint]

Есть два id: bigint, и я хочу их удалить. Как я могу сделать?

4b9b3361

Ответ 1

Чтение документации Spark я нашел более легкое решение.

Начиная с версии 1.4 искры существует функция drop(col), которая может использоваться в pyspark на кадре данных.

Вы можете использовать его двумя способами.

  • df.drop('age').collect()
  • df.drop(df.age).collect()

Документация Pyspark - Drop

Ответ 2

Добавляя к ответу @Patrick, вы можете использовать следующее, чтобы удалить несколько столбцов

columns_to_drop = ['id', 'id_copy']
df = df.drop(*columns_to_drop)

Ответ 3

Простым способом сделать это будет пользователь "select" и понять, что вы можете получить список всех columns для dataframe, df, с df.columns

drop_list = ['a column', 'another column', ...]

df.select([column for column in df.columns if column not in drop_list])

Ответ 4

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

keep = [a.id, a.julian_date, a.user_id, b.quan_created_money, b.quan_created_cnt]

Или в более общем подходе вы должны включать все столбцы, кроме определенного, через понимание списка. Например, например (исключая столбец id из b):

keep = [a[c] for c in a.columns] + [b[c] for c in b.columns if c != 'id']

Наконец, вы делаете выбор в своем результате соединения:

d = a.join(b, a.id==b.id, 'outer').select(*keep)

Ответ 5

Вы можете использовать два способа:

1: Вы просто сохраняете необходимые столбцы:

drop_column_list = ["drop_column"]
df = df.select([column for column in df.columns if column not in drop_column_list])  

2: это более изящный способ.

df = df.drop("col_name")

Вам следует избегать версии collect(), поскольку она отправит мастеру полный набор данных, это потребует больших вычислительных усилий!

Ответ 6

Может быть, немного не по теме, но вот решение с помощью Scala. Создайте Array имен столбцов из oldDataFrame и удалите столбцы, которые вы хотите удалить ("colExclude"). Затем передайте Array[Column] в select и распакуйте его.

val columnsToKeep: Array[Column] = oldDataFrame.columns.diff(Array("colExclude"))
                                               .map(x => oldDataFrame.col(x))
val newDataFrame: DataFrame = oldDataFrame.select(columnsToKeep: _*)

Ответ 7

Рассмотрим 2 кадра данных:

>>> aDF.show()
+---+----+
| id|datA|
+---+----+
|  1|  a1|
|  2|  a2|
|  3|  a3|
+---+----+

а также

>>> bDF.show()
+---+----+
| id|datB|
+---+----+
|  2|  b2|
|  3|  b3|
|  4|  b4|
+---+----+

Чтобы выполнить то, что вы ищете, есть 2 способа:

1. Различные условия соединения. Вместо того чтобы сказать aDF.id == bDF.id

aDF.join(bDF, aDF.id == bDF.id, "outer")

Напишите это:

aDF.join(bDF, "id", "outer").show()
+---+----+----+
| id|datA|datB|
+---+----+----+
|  1|  a1|null|
|  3|  a3|  b3|
|  2|  a2|  b2|
|  4|null|  b4|
+---+----+----+

Это автоматически избавит от лишнего процесса сбрасывания.

2. Используйте псевдонимы: в этом случае вы потеряете данные, связанные с B Specific Id.

>>> from pyspark.sql.functions import col
>>> aDF.alias("a").join(bDF.alias("b"), aDF.id == bDF.id, "outer").drop(col("b.id")).show()

+----+----+----+
|  id|datA|datB|
+----+----+----+
|   1|  a1|null|
|   3|  a3|  b3|
|   2|  a2|  b2|
|null|null|  b4|
+----+----+----+

Ответ 8

Вы можете удалить столбец следующим образом:

df.drop("column Name).columns

В твоем случае:

df.drop("id").columns

Если вы хотите удалить более одного столбца, вы можете сделать:

dfWithLongColName.drop("ORIGIN_COUNTRY_NAME", "DEST_COUNTRY_NAME")