PySpark根据列名/字符串条件删除列

chhqkbe1  于 2023-04-21  发布在  Apache
关注(0)|答案(2)|浏览(101)

我想删除包含banned_columns列表中的任何单词的pyspark Dataframe 中的列,并使用剩余的列形成一个新的 Dataframe

banned_columns = ["basket","cricket","ball"]
drop_these = [columns_to_drop for columns_to_drop in df.columns if columns_to_drop in banned_columns]

df_new = df.drop(*drop_these)

banned_columns的想法是删除以basketcricket开头的任何列,以及名称中包含单词ball的任何列。
以上就是我目前所做的,但它不起作用(因为在新的dataframe中仍然包含那些列名)
Dataframe 示例

sports1basketjump | sports

在上面的列名示例中,它将删除列sports1basketjump,因为它包含单词basket。
此外,使用filter或/和reduce函数是否比创建列表和for循环更优化?

4ioopgfo

4ioopgfo1#

你的list comprehension并没有做你期望它做的事情。它将返回一个空的list,除非它 * 完全 * 匹配一个字符串。关于如何将一个子字符串列表与一个字符串列表匹配的答案,请查看matching list of substrings to a list of strings in Python
df.drop(*cols)将如您所期望的那样工作。

8i9zcol2

8i9zcol22#

假设 Dataframe df需要删除一些列,首先构建一个正则表达式,它将匹配被禁止的列子字符串。这可以通过将字符串值与|组合来完成。模式的结果值为"basket|cricket|ball"

import re
banned_columns = ["basket","cricket","ball"]
pattern = "|".join(re.escape(s) for s in banned_columns)

现在构建正则表达式并将其存储在一个变量中,以便在过滤器中使用。

crexp = re.compile(pattern)

使用filter命令过滤完整的列名df.columns列表。filter命令的结果是一个枚举器,因此使用list将其枚举到所需的列名列表中。

drop_these = list(filter(lambda s: (crexp.search(s)), df.columns))

最后,删除不需要的列。

df_new = df.drop(*drop_these)

相关问题