我想删除包含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
的想法是删除以basket
和cricket
开头的任何列,以及名称中包含单词ball
的任何列。
以上就是我目前所做的,但它不起作用(因为在新的dataframe中仍然包含那些列名)
Dataframe 示例
sports1basketjump | sports
在上面的列名示例中,它将删除列sports1basketjump
,因为它包含单词basket。
此外,使用filter
或/和reduce
函数是否比创建列表和for循环更优化?
2条答案
按热度按时间4ioopgfo1#
你的list comprehension并没有做你期望它做的事情。它将返回一个空的list,除非它 * 完全 * 匹配一个字符串。关于如何将一个子字符串列表与一个字符串列表匹配的答案,请查看matching list of substrings to a list of strings in Python
df.drop(*cols)
将如您所期望的那样工作。8i9zcol22#
假设 Dataframe
df
需要删除一些列,首先构建一个正则表达式,它将匹配被禁止的列子字符串。这可以通过将字符串值与|
组合来完成。模式的结果值为"basket|cricket|ball"
。现在构建正则表达式并将其存储在一个变量中,以便在过滤器中使用。
使用
filter
命令过滤完整的列名df.columns
列表。filter命令的结果是一个枚举器,因此使用list
将其枚举到所需的列名列表中。最后,删除不需要的列。