在 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 数据框中搜索和替换大型数据集的主要内容,如果未能解决你的问题,请参考以下文章
如果在另一个数据框中确实存在,则删除行 - python pandas