【问题标题】:Search and Replace in pandas dataframe for large dataset在 pandas 数据框中搜索和替换大型数据集
【发布时间】:2018-07-30 21:52:06
【问题描述】:

我有一个 100 万大小的数据集并输入数据框。

标识说明 1 bc 单相交流电 2 调理累积 3 dsply 值交流 和大小为 2927 的字典如下所示: 核心价值 累加器 bb踢脚线 显示器

执行以下代码,将数据框中的字典键替换为其值

dataset=dataset.replace(dict, regex=True)

但它会消耗更多时间来执行,即 104.07914903743769 秒用于 2000 数据集并具有 8GB RAM 我需要将此代码应用于数百万个数据集。那么谁能告诉我如何减少执行时间?还有其他方法可以完成这项任务吗?

【问题讨论】:

  • regex=True 有必要吗?
  • 您是否尝试仅在 1 列上进行替换?
  • 如果需要,您可以分块进行
  • @sshashank124 假设 OP 想要进行部分替换,那么有必要使用regex=True。如果没有,对于大型字典, map 会更快。 stackoverflow.com/questions/20250771/…
  • 另一个想法是了解实际包含需要替换的值的行的百分比。如果数据集非常大,您可能会通过过滤到仅在字典的键部分中有值的行来提高性能

标签: python regex pandas


【解决方案1】:

任务可以轻松拆分,因为您的操作对于每一行都是独立的。通过多线程甚至在多台计算机上计算可以提高速度(这是 MapReduce 范例中的经典映射操作)。内存消耗也是如此:您可以加载不是完整的数据集,而是部分加载,应用替换,保存结果并继续。

【讨论】:

    【解决方案2】:

    我看到预编译正则表达式的改进约为 15%。

    但要获得最佳性能,请参阅@unutbu's excellent solution

    import pandas as pd
    import re
    
    rep_dict = {'accum': 'accumulator', 'bb': 'baseboard', 'dsply': 'display'}
    pattern = re.compile("|".join([re.escape(k) for k in rep_dict.keys()]), re.M)
    
    def multiple_replace(string):    
        return pattern.sub(lambda x: rep_dict[x.group(0)], string)
    
    df = pd.DataFrame({'description': ['bc single phase acr', 'conditioning accum', 'dsply value ac']})
    df = pd.concat([df]*10000)
    
    %timeit df['description'].map(multiple_replace)          # 72.8 ms per loop
    %timeit df['description'].replace(rep_dict, regex=True)  # 88.6 ms per loop
    

    【讨论】:

    • 如果 df 更改为 df = pd.DataFrame({'description': ['bc single phase acr', 'conditioning accumulator', 'dsply value ac']}),则在替换后 df 的第二个值更改为 conditioning accumulatorulator,这不应该发生。
    • @RanjanaGirish。确实如此,但您现有的解决方案dataset=dataset.replace(dict, regex=True) 也是如此。我对您的问题的阅读是您需要优化此功能。您的新要求将意味着任何进程都将变得更慢,因为您需要用空格分隔。
    猜你喜欢
    • 2018-08-11
    • 1970-01-01
    • 2020-10-08
    • 1970-01-01
    • 1970-01-01
    • 2020-06-19
    • 2018-12-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多