在 pandas 数据框中搜索和替换大型数据集

Posted

技术标签:

【中文标题】在 pandas 数据框中搜索和替换大型数据集【英文标题】:Search and Replace in pandas dataframe for large dataset 【发布时间】: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 会更快。 ***.com/questions/20250771/… 另一个想法是了解实际包含需要替换的值的行的百分比。如果数据集非常大,您可能会通过过滤到仅在字典的键部分中有值的行来提高性能 【参考方案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) 也是如此。我对您的问题的阅读是您需要优化此功能。您的新要求将意味着任何进程都将变得更慢,因为您需要用空格分隔。

以上是关于在 pandas 数据框中搜索和替换大型数据集的主要内容,如果未能解决你的问题,请参考以下文章

在pandas数据框中搜索并替换点和逗号

python pandas用数字替换数据框中的字符串

如果在另一个数据框中确实存在,则删除行 - python pandas

在 Pandas 数据框中查找和替换子字符串忽略大小写

如何在 pandas 的数据框中选择多个日期列,然后将它们全部格式化? (Python)

pandas.concat 和 numpy.append 的大型数据集的内存错误