如何使用多个字符串条件加速 pandas 布尔索引
How to speed up pandas boolean indexing with multiple string conditions
我有一个 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项的字符串列表
如果你有这么多行,我认为先一步一步地删除记录会更快。正则表达式通常很慢,因此您可以将其作为最后一步使用更小的数据框。
例如:
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)]
我曾认为链接我的条件是个好主意,但让它们连续的答案帮助我重新思考:每次我 运行 布尔索引操作,我都在使数据集更小 - 因此更便宜下一步操作。
我已经按照建议将它们分开,并将去除最多行的操作放在顶部,以便接下来的操作更快。我把正则表达式放在最后 - 因为它很昂贵,所以在尽可能小的 df 上做它是有意义的。
希望这对某人有所帮助! TIL 链接您的操作看起来不错,但效率不高:)
我有一个 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项的字符串列表
如果你有这么多行,我认为先一步一步地删除记录会更快。正则表达式通常很慢,因此您可以将其作为最后一步使用更小的数据框。
例如:
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)]
我曾认为链接我的条件是个好主意,但让它们连续的答案帮助我重新思考:每次我 运行 布尔索引操作,我都在使数据集更小 - 因此更便宜下一步操作。
我已经按照建议将它们分开,并将去除最多行的操作放在顶部,以便接下来的操作更快。我把正则表达式放在最后 - 因为它很昂贵,所以在尽可能小的 df 上做它是有意义的。
希望这对某人有所帮助! TIL 链接您的操作看起来不错,但效率不高:)