How to delete columns in 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]

There are two id: bigint and I want to delete one. How can I do?

324488 次浏览

您可以显式地命名希望保留的列,如下所示:

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

或者在一个更一般的方法中,你可以通过一个列表内涵包括所有的列,除了一个特定的列。例如这样(不包括 b中的 id列) :

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)

也许有点偏离主题,但这里是使用 Scala 的解决方案。从 oldDataFrame中创建列名的 Array,并删除要删除 ("colExclude")的列。然后将 Array[Column]传递给 select并将其解压缩。

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

在阅读 Spark 文档时,我发现了一个更简单的解决方案。

由于版本1.4的火花有一个功能 drop(col),可用于火花在一个数据帧。

你可以用两种方式使用它

  1. df.drop('age')
  2. df.drop(df.age)

火花文档-下载

一个简单的方法来做到这一点是用户“ select”,并认识到你可以得到一个所有 columnsdataframedf,与 df.columns的名单

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


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

添加到@Patrick 的答案中,您可以使用以下内容删除多个列

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

你可以用两种方法:

1: 你只需要保留必要的栏目:

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

他说: 这是更优雅的方式。

df = df.drop("col_name")

您应该避免收集()版本,因为它将发送到主人的完整数据集,它将采取大量的计算工作!

考虑两个 dataFrame:

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

还有

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

要实现你的目标,有两种方法:

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 特定 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|
+----+----+----+

你可以像这样删除列:

df.drop("column Name).columns

就你而言:

df.drop("id").columns

如果您想删除多个列,可以这样做:

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

是的,可以通过这样的切片来删除/选择列:

列[ a: b ]

Select (slice) . show ()

例如:

newDF = spark.createDataFrame([
(1, "a", "4", 0),
(2, "b", "10", 3),
(7, "b", "4", 1),
(7, "d", "4", 9)],
("id", "x1", "x2", "y"))




slice = newDF.columns[1:3]
newDF.select(slice).show()

使用 select 方法获取特性列:

features = newDF.columns[:-1]
newDF.select(features).show()

使用 drop 方法获取最后一列:

last_col= newDF.drop(*features)
last_col.show()