我有dataframe
个包含11400万条记录,其中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多个小时,还没有完成。
更多信息:拥有114百万条记录的原始数据帧非常适合内存,大约需要4.2 GB。我用迭代运行上面的代码的那一刻,内存占用率突然增加到近20GB。 我显然一次只处理50000条记录并替换字典中的值。为什么内存使用会急剧增加?
有没有办法让这段代码更快?或者有另一种方法可以达到相同的效果吗?
非常感谢任何帮助。
答案 0 :(得分:0)
你可以尝试:
d = {'123': '2', '234': '1', '678': '3'}
df['artifact_id'] = df.artifact_id.astype(str).map(d)