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

标签 python memory-management

我有一个包含 1.14 亿条记录的 dataframe,其中 2 列名为 session_idartifact_id。两列都是分类的。我想用字典中的值替换 artifact_id 列中的值,其中 artifact_id 中的每个值都映射到另一个值。 Artifact_id 是一个int 列,要替换的值也是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 多个小时,还没有完成。

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

有没有办法让这段代码更快?还是有其他方法可以获得相同的结果?

如有任何帮助,我们将不胜感激。

最佳答案

你能试试吗:

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

关于python - 如何以快速且内存高效的方式替换列中的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45680323/

相关文章:

python - Keras 可变大小的掩模或切片

C++ new int[0]——它会分配内存吗?

java - 如何知道是否有足够的内存可以在 Linux 机器上部署新应用程序?

Android 运行应用内存占用

python - 使用 Python 进行网页抓取 - 链接与表单输入保持不变

python - 如何用 Python 包装 CLI 程序(保持交互性)?

python - sys.getrefcount() 返回远高于 2 的值

android - Nexus 的最大堆大小?

android - Android 中使用的确切内存模型是什么?

python - 在 django 模板中,如何显示存储为 BinaryField 模型字段的图像?