pyspark 如何删除pysark Dataframe 中的列

wz1wpwve  于 2022-11-01  发布在  Spark
关注(0)|答案(9)|浏览(618)
  1. >>> a
  2. DataFrame[id: bigint, julian_date: string, user_id: bigint]
  3. >>> b
  4. DataFrame[id: bigint, quan_created_money: decimal(10,0), quan_created_cnt: bigint]
  5. >>> a.join(b, a.id==b.id, 'outer')
  6. DataFrame[id: bigint, julian_date: string, user_id: bigint, id: bigint, quan_created_money: decimal(10,0), quan_created_cnt: bigint]

有两个id: bigint,我想删除一个,怎么办?

niwlg2el

niwlg2el1#

在阅读Spark文档时,我发现了一个更简单的解决方案。
自spark版本1.4起,有一个函数drop(col),可用于 Dataframe 上的pysark。
您可以通过两种方式使用它

  1. df.drop('age')
  2. df.drop(df.age)
    Pyspark Documentation - Drop
b5lpy0ml

b5lpy0ml2#

添加到@Patrick 's answer,您可以使用以下命令删除多个列

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

lo8azlld3#

一个简单的方法是使用“select“,并意识到您可以获得dataframe的所有columns的列表,即df,其中df.columns

  1. drop_list = ['a column', 'another column', ...]
  2. df.select([column for column in df.columns if column not in drop_list])
zzoitvuj

zzoitvuj4#

可以采用两种方式:
1:您只需保留必要的列:

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

2:这是更优雅的方式。

  1. df = df.drop("col_name")

你应该避免collect()版本,因为它会向master发送完整的数据集,这将需要大量的计算工作!

kg7wmglp

kg7wmglp5#

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

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

或者,在一个更通用的方法中,你可以通过列表解析包含除特定列之外的所有列,例如(从b中排除id列):

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

最后,对连接结果进行选择:

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

bz4sfanl6#

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

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

rsaldnfx7#

是的,可以通过如下切片来删除/选择列:
切片=数据.列[a:B]
data.select切片).show()
示例:

  1. newDF = spark.createDataFrame([
  2. (1, "a", "4", 0),
  3. (2, "b", "10", 3),
  4. (7, "b", "4", 1),
  5. (7, "d", "4", 9)],
  6. ("id", "x1", "x2", "y"))
  7. slice = newDF.columns[1:3]
  8. newDF.select(slice).show()

使用select方法获取特性列:

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

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

  1. last_col= newDF.drop(*features)
  2. last_col.show()
展开查看全部
xxe27gdn

xxe27gdn8#

考虑2个 Dataframe :

  1. >>> aDF.show()
  2. +---+----+
  3. | id|datA|
  4. +---+----+
  5. | 1| a1|
  6. | 2| a2|
  7. | 3| a3|
  8. +---+----+

  1. >>> bDF.show()
  2. +---+----+
  3. | id|datB|
  4. +---+----+
  5. | 2| b2|
  6. | 3| b3|
  7. | 4| b4|
  8. +---+----+

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

**1.加入条件不同。**不要说aDF.id == bDF.id

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

写下:

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

这将自动摆脱额外的下降过程。

**2.使用别名:**您将丢失此中与B特定ID相关的数据。

  1. >>> from pyspark.sql.functions import col
  2. >>> aDF.alias("a").join(bDF.alias("b"), aDF.id == bDF.id, "outer").drop(col("b.id")).show()
  3. +----+----+----+
  4. | id|datA|datB|
  5. +----+----+----+
  6. | 1| a1|null|
  7. | 3| a3| b3|
  8. | 2| a2| b2|
  9. |null|null| b4|
  10. +----+----+----+
展开查看全部
w1jd8yoj

w1jd8yoj9#

您可以这样删除列:

  1. df.drop("column Name).columns

在您的情况下:

  1. df.drop("id").columns

如果要删除多个列,可以执行以下操作:

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

相关问题