当前位置: 首页 > 知识库问答 >
问题:

如何通过索引从火花数据帧中删除列,其中列名可以重复?

管翼
2023-03-14

我有一个火花数据帧,只想删除最后一列。

我试过了

df.drop(df.columns.last)` 

但出现错误:“list”对象没有属性“last”。

我还尝试了:

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

但这会删除所有与last同名的列。

使用Spark 2.4

共有2个答案

黄兴业
2023-03-14

这是一种可以按索引删除任何列的方法。

假设您有以下数据帧:

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']

然后使用range重命名DataFrame中的所有列,以便新列名是唯一的(它们将只是列索引)。

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|
#+---+---+

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

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

colnames = df.columns
df = df.toDF(*map(str, range(len(colnames))))\
    .drop(str(len(colnames)-1))\
    .toDF(*colnames[:-1])
申光临
2023-03-14

最好按名称删除列。一些操作(如withColumn)可以更改列的顺序。如果一个数据帧有重复的名称,则通过数据帧引用该列。column\u name(列名称)而不是“columnName”(列名称),这会导致歧义。

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

一般而言,df。删除(df.columnName)

 类似资料:
  • 假设我们有一个列为col1、col2、col3、col4的数据帧。现在,在保存df时,我想使用col2进行分区,并且我将保存的最终df不应该有col2。所以最终的df应该是col1、col3、col4。关于如何实现这一点,有什么建议吗?

  • 我想将以下数据框的第1列重命名为“Ref”。我有很多列,因此无法重命名每个列或为每个列设置名称。 这是数据帧 现在我想将第一列重命名为'Ref'。我试过这个 它重命名所有标题与列[1]相似的列。

  • 问题内容: 如何在Python中按索引从列表中删除元素? 我找到了方法,但是说我想删除最后一个元素,该怎么做?似乎默认的搜索列表,但是我不希望执行任何搜索。 问题答案: 使用并指定要删除的元素的索引:

  • 我有一个包含大量列的Spark数据框架。我想从中删除两列以获得新的数据帧。 如果列更少,我可以在API中使用select方法,如下所示: 但是既然从长列表中挑选列是一项乏味的任务,有解决方法吗?

  • 我有麻烦重命名基于csv的数据帧的标头。 我得到了以下数据帧:df1: 现在我想根据csv文件更改列名(第一行),如下所示: 因此,我期望数据帧如下所示: 有什么想法吗?感谢您的帮助:)

  • 本文向大家介绍如何通过R中data.table中的列名删除列?,包括了如何通过R中data.table中的列名删除列?的使用技巧和注意事项,需要的朋友参考一下 我们可以通过将列设置为NULL来实现 示例 删除一列x 删除两列