如何快速将id重新映射到连续数字

ele*_*ora 7 python dataframe pandas

我有一个大的csv文件,其中的行看起来像

stringa,stringb
stringb,stringc
stringd,stringa
Run Code Online (Sandbox Code Playgroud)

我需要转换它,以便id从0开始连续编号.在这种情况下,以下方法可行

0,1
1,2
3,0
Run Code Online (Sandbox Code Playgroud)

我目前的代码如下:

import csv
names = {}
counter = 0
with open('foo.csv', 'rb') as csvfile:
     reader = csv.reader(csvfile)
     for row in reader:
         if row[0] in names:
             id1 =  row[0]
         else:
             names[row[0]] = counter
             id1 = counter
             counter += 1
         if row[1] in names:
             id2 = row[1]
         else:
             names[row[1]] = counter
             id2 = counter
             counter += 1
     print id1, id2
Run Code Online (Sandbox Code Playgroud)

Python dicts遗憾地使用了大量内存,而且我的输入很大.

当输入太大而dict不适合内存时,我该怎么办?

如果有更好/更快的方法来解决这个问题,我也会感兴趣.

piR*_*red 6

df = pd.DataFrame([['a', 'b'], ['b', 'c'], ['d', 'a']])

v = df.stack().unique()
v.sort()
f = pd.factorize(v)
m = pd.Series(f[0], f[1])

df.stack().map(m).unstack()
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述