如何从 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删除重复项保持第一