【问题标题】:How to drop a column from a spark dataframe by index where column names can be duplicated?如何通过可以复制列名的索引从 spark 数据框中删除列?
【发布时间】:2020-05-10 00:07:48
【问题描述】:

我有一个 spark 数据框,只想删除最后一列。

我试过了

df.drop(df.columns.last)` 

但出现错误AttributeError: 'list' object has no attribute 'last'

我也试过了:

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

但这会删除所有与上一个名称相同的列。

使用 Spark 2.4

【问题讨论】:

  • 最好是按名称删除。 withColumn 可以改变列的顺序
  • @Joe 我会推荐以下内容:1) 将列名保存到列表中:colnames = df.columns 2) 重命名列以使名称唯一:df = df.toDF(*range(colnames)) 3) 删除最后一列 @ 987654327@ 4) 将列重命名回原来的名称:df = df.toDF(*cols[:-1])。如果问题重新打开,请联系我,我会发布答案。
  • @pault 我重新打开了问题

标签: dataframe apache-spark pyspark


【解决方案1】:

最好按名称删除列。像withColumn 这样的一些操作可以改变列的顺序。如果数据框有来自连接的重复名称,则通过 dataframe.column_name 引用该列,而不是通过 "columnName" 引用它,这会导致歧义。

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

一般df.drop(df.columnName)

【讨论】:

  • 列名可能不明确,因为这里将有 2 个名称为 c1 的列。
  • 如果我这样做 df2.drop('C1') 那么它就很模糊。但如果我这样做 df2.drop(df2.C1) 则不是。请尝试。
  • 我需要示例和火花版本来重现。
【解决方案2】:

您可以采用以下方法按索引删除任何列。

假设您有以下 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']

然后rename all of the columns in the 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|
#+---+---+

您可以轻松地将其扩展到任何索引,因为我们使用 range 重命名。


出于解释的目的,我将其分解为多个步骤,但您也可以更紧凑地执行此操作,如下所示:

colnames = df.columns
df = df.toDF(*map(str, range(len(colnames))))\
    .drop(str(len(colnames)-1))\
    .toDF(*colnames[:-1])

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-03-28
    • 2017-02-08
    • 2020-02-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多