微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何使用多个字符串条件加速熊猫布尔索引

如何解决如何使用多个字符串条件加速熊猫布尔索引

我有一个 7300 万行的数据集,我需要过滤掉符合任何几个条件的行。我一直在用布尔索引来做这个,但它需要很长时间(~30 分钟),我想知道我是否可以让它更快(例如花式索引、np.where、np.compress?)

我的代码

clean_df = df[~(df.project_name.isin(p_to_drop) | 
                df.workspace_name.isin(ws_to_drop) | 
                df.campaign_name.str.contains(regex_string,regex=True) | 
                df.campaign_name.isin(small_launches))]

正则字符串是

regex_string = '(?i)^.*ARCHIVE.*$|^.*birthday.*$|^.*bundle.*$|^.*Competition followups.*$|^.*consent.*$|^.*DOI.*$|\
                    ^.*experiment.*$|^.*hello.*$|^.*new subscribers.*$|^.*not purchased.*$|^.*parent.*$|\
                    ^.*re engagement.*$|^.*reengagement.*$|^.*re-engagement.*$|^.*resend.*$|^.*Resend of.*$|\
                    ^.*reward.*$|^.*survey.*$|^.*test.*$|^.*thank.*$|^.*welcome.*$'

其他三个条件是少于 50 项的字符串列表。

解决方法

我曾认为链接我的条件是个好主意,但让它们连续的答案帮助我重新思考:每次我运行布尔索引操作时,我都会使数据集更小 - 因此下一次操作的成本更低。

>

我已按照建议将它们分开,并将去除最多行的操作放在顶部,因此接下来的操作会更快。我把正则表达式放在最后 - 因为它很昂贵,所以在尽可能小的 df 上做它是有意义的。

希望这对某人有所帮助! TIL 链接您的操作看起来不错,但效率不高:)

,

如果你有这么多行,我想先一步一步地删除记录会更快。正则表达式通常很慢,因此您可以将其用作处理小得多的数据框的最后一步。

例如:

clean_df = df.copy()
clean_df = clean_df.loc[~(df.project_name.isin(p_to_drop)]
clean_df = clean_df.loc[~df.workspace_name.isin(ws_to_drop)]
clean_df = clean_df.loc[~df.campaign_name.isin(small_launches)]
clean_df = clean_df.loc[~df.campaign_name.str.contains(regex_string,regex=True)]

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。