[英]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.