如何以快速且内存有效的方式替换列中的值

时间:2017-08-14 17:59:34

标签: python memory-management

我有dataframe个包含11400万条记录,其中2列名为session_idartifact_id。这两列都是分类的。我想将列artifact_id中的值替换为字典中的值,其中artifact_id中的每个值都映射到另一个值。 Artifact_idint列,要替换的值也是int值。大约有322k个唯一值需要替换。

这是我的样本数据集:

Session_id    artifact_id
    A              234
    A              123
    B              123
    B              678

字典的内容如下:

{'234':'1','123':'2','678':'3'}

我希望最终数据集看起来像这样:

Session_id    artifact_id
    A              1
    A              2
    B              2
    B              3

我原以为以下陈述会取代这些值:

Sessions['artifact_id'].replace(artifactId2Num, inplace=True)

artifactId2Num是字典的名称。该声明给出了out of memory错误。所以我考虑将这个过程分解成各个部分以避免MemoryError使用以下代码:

count = 0
for idx in xrange(0,len(Sessions),50000):
    count = count + 1
    print(count)
    if (idx+50000) > len(Sessions):
        Sessions[idx:(len(Sessions)-1)]['artifact_id'].replace(artifactId2Num, inplace=True)
    else:
        Sessions[idx:(idx+50000)]['artifact_id'].replace(artifactId2Num, inplace=True)

上面的代码到目前为止没有任何错误。它已经运行了大约10多个小时,还没有完成。

更多信息:拥有114百万条记录的原始数据帧非常适合内存,大约需要4.2 GB。我用迭代运行上面的代码的那一刻,内存占用率突然增加到近20GB。 我显然一次只处理50000条记录并替换字典中的值。为什么内存使用会急剧增加?

有没有办法让这段代码更快?或者有另一种方法可以达到相同的效果吗?

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:0)

你可以尝试:

d = {'123': '2', '234': '1', '678': '3'}
df['artifact_id'] = df.artifact_id.astype(str).map(d)