繁体   English   中英

如何在过滤器和 lambda 函数中使用多列 pyspark

[英]How to use multiple columns in filter and lambda functions pyspark

我有一个数据框,我想在其中删除名称以“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))

您执行以下操作:

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

在 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您不需要解压缩列表。

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

我希望这有帮助。

好吧,您似乎可以使用常规列过滤器,如下所示:

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

df.drop(*forColumns)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM