如何从 Spark DataFrame 中删除列表中给出的多个列名?

Posted

技术标签:

【中文标题】如何从 Spark DataFrame 中删除列表中给出的多个列名?【英文标题】:How to drop multiple column names given in a list from Spark DataFrame? 【发布时间】:2017-12-15 10:58:21 【问题描述】:

我有一个基于 n 值创建的动态列表。

n = 3
drop_lst = ['a' + str(i) for i in range(n)]
df.drop(drop_lst)

但上述方法不起作用。

注意

我的用例需要一个动态列表。

如果我只是在没有列表的情况下执行以下操作

df.drop('a0','a1','a2')

如何使下拉功能与列表一起使用?

Spark 2.2 似乎没有此功能。有没有办法让它在不使用select() 的情况下工作?

【问题讨论】:

【参考方案1】:

您可以使用* 运算符将列表的内容作为参数传递给drop()

df.drop(*drop_lst)

【讨论】:

谢谢! * 运算符是做什么的?它有什么意义? 如果你把它放在它的左边,星号会解压迭代器的内容,即。它会生成列表中的各个元素。 这对我不起作用,它给出:TypeError: drop() 恰好需要 2 个参数(给定 92 个)。我可能有旧版本? 回答我自己的问题:我刚刚检查过,在我的版本(1.6.2)中,这里描述的列表方法不起作用。 该解决方案适用于 python 但不适用于 scala for scala 查看答案由@fox ghost 下面【参考方案2】:

您可以将列名指定为逗号分隔的列表,例如

df.drop("col1","col11","col21")

【讨论】:

【参考方案3】:

这是如何在 scala 中删除指定数量的连续列:

val ll = dfwide.schema.names.slice(1,5)
dfwide.drop(ll:_*).show

slice 有两个参数星索引和结束索引。

【讨论】:

【参考方案4】:

使用简单循环:

for c in drop_lst:
   df = df.drop(c)

【讨论】:

A code-only answer is not high quality。虽然此代码可能很有用,但您可以通过说明其工作原理、工作方式、何时应该使用以及它的局限性来改进它。请edit您的回答包括解释和相关文档的链接。【参考方案5】:

您可以使用drop(*cols) 2 种方式。

    df.drop('age').collect() df.drop(df.age).collect()

查看官方文档DataFrame.drop

【讨论】:

在这种情况下 .collect() 做了什么?

以上是关于如何从 Spark DataFrame 中删除列表中给出的多个列名?的主要内容,如果未能解决你的问题,请参考以下文章

如何从列类型列表中删除 pandas DataFrame 中的空值

Spark DataFrame - 使用 Java API 选择列列表

如何在 Spark 中对 DataFrame 进行分区和写入而不删除没有新数据的分区?

Spark DataFrame通过GroupBy删除重复项保持第一

从 PySpark DataFrame 中的列表列表中删除列表

如何从 Spark DataFrame 中选择稳定的行子集?