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

时间:2018-02-20 13:53:24

标签: python regex pandas

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

Id      description
 1      bc single phase acr
 2      conditioning accum
 3      dsply value ac
和字典大小2927,如下所示:

Key     Value
accum   accumulator
bb      baseboard
dsply   display

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

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

但它会耗费更多的时间来表示,即2000年数据集的104.07914903743769秒,并且有8GB内存 我需要为数百万的数据集应用此代码。所以有人能告诉我如何减少执行时间吗?还有其他方法可以完成任务吗?

2 个答案:

答案 0 :(得分:1)

我看到预编译正则表达式提高了约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

答案 1 :(得分:0)

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