Python 如何在filter和lambda函数中使用多列

Python 如何在filter和lambda函数中使用多列,python,pyspark,pyspark-dataframes,Python,Pyspark,Pyspark Dataframes,我有一个数据框,在其中我想删除名称以“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.

我有一个数据框,在其中我想删除名称以“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))
val forColumns = df.columns.filter(x => (x.startsWith("test") || x.startsWith("id_1") || x.startsWith("vehicle"))) ++ ["c_007"]

df.drop(*forColumns)

在PySpark 2.1.0版中,可以使用
drop
删除多列,方法是提供字符串列表(包含要删除的列的名称)作为
drop
的参数。(见文件)

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

cols_to_drop = [x for x in colunas if (x.startswith('test') or x.startswith('id_1') or x.startswith('vehicle'))]
# 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)
然后应用
下拉菜单
打开列表:

df1.drop(*cols_to_drop)
最终,使用
select
也可以获得类似的结果。例如:

cols_to_drop = [x for x in colunas if (x.startswith('test') or x.startswith('id_1') or x.startswith('vehicle'))]
# 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)
请注意,通过使用
选择
,您不需要解压缩列表

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


我希望这会有所帮助。

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

expression = lambda col: all([col.startswith(i) for i in ['test', 'id_1', 'vehicle']])
df1.drop(*filter(lambda col:  expression(col), df.columns))
val forColumns = df.columns.filter(x => (x.startsWith("test") || x.startsWith("id_1") || x.startsWith("vehicle"))) ++ ["c_007"]

df.drop(*forColumns)