我有一个包含 1.14 亿条记录的 dataframe
,其中 2 列名为 session_id
和 artifact_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/