【问题标题】:How to use multiple columns in filter and lambda functions pyspark如何在过滤器和 lambda 函数 pyspark 中使用多列
【发布时间】:2020-02-25 18:05:05
【问题描述】:

我有一个数据框,我想在其中删除名称以“test”、“id_1”、“vehicle”等开头的列

我使用下面的代码删除一列

df1.drop(*filter(lambda col: 'test' in col, df.columns))

如何在这一行中一次指定所有列? 这不起作用:

df1.drop(*filter(lambda col: 'test','id_1' in col, df.columns))

【问题讨论】:

    标签: python pyspark pyspark-dataframes


    【解决方案1】:

    您执行以下操作:

    expression = lambda col: all([col.startswith(i) for i in ['test', 'id_1', 'vehicle']])
    df1.drop(*filter(lambda col:  expression(col), df.columns))
    

    【讨论】:

      【解决方案2】:

      在 PySpark 版本 2.1.0 中,可以使用 drop 删除多个列,方法是提供一个字符串列表(带有要删除的列的名称)作为 drop 的参数。 (参见文档http://spark.apache.org/docs/2.1.0/api/python/pyspark.sql.html?highlight=drop#pyspark.sql.DataFrame.drop)。

      在您的情况下,您可以创建一个列表,其中包含要删除的列的名称。例如:

      cols_to_drop = [x for x in colunas if (x.startswith('test') or x.startswith('id_1') or x.startswith('vehicle'))]
      

      然后应用drop解包列表:

      df1.drop(*cols_to_drop)
      

      最终,使用select也可以达到类似的效果。例如:

      # Define columns you want to keep
      cols_to_keep = [x for x in df.columns if x not in cols_to_drop]
      
      # create new dataframe, df2, that keeps only the desired columns from df1
      df2 = df1.select(cols_to_keep)
      

      请注意,通过使用select,您无需解压列表。

      请注意,这个question 也解决了类似的问题。

      我希望这会有所帮助。

      【讨论】:

        【解决方案3】:

        好吧,看来您可以使用以下常规列过滤器:

        val forColumns = df.columns.filter(x => (x.startsWith("test") || x.startsWith("id_1") || x.startsWith("vehicle"))) ++ ["c_007"]
        
        df.drop(*forColumns)
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2020-01-26
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-12-18
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多