如何在过滤器和 lambda 函数 pyspark 中使用多列
Posted
技术标签:
【中文标题】如何在过滤器和 lambda 函数 pyspark 中使用多列【英文标题】:How to use multiple columns in filter and lambda functions 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))
【问题讨论】:
【参考方案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)
【讨论】:
以上是关于如何在过滤器和 lambda 函数 pyspark 中使用多列的主要内容,如果未能解决你的问题,请参考以下文章
在AWS lambda函数上使用pyspark二进制文件,在向驱动程序发送其端口号之前退出错误Java网关进程