Как удалить столбцы в 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
, и я хочу их удалить. Как я могу сделать?
Ответы
Ответ 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")