【问题标题】:How to drop multiple column names given in a list from Spark DataFrame?如何从 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() 的情况下工作?

【问题讨论】:

    标签: apache-spark dataframe pyspark apache-spark-sql pyspark-sql


    【解决方案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 种方式。

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

        查看官方文档DataFrame.drop

        【讨论】:

        • 在这种情况下 .collect() 做了什么?
        猜你喜欢
        • 2021-12-07
        • 2015-12-20
        • 2016-07-08
        • 2020-09-22
        • 2019-07-02
        • 2021-05-24
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多