Use factorize
:
df['col'] = pd.factorize(df.col)[0]
print (df)
col
0 0
1 1
2 0
3 0
4 1
Docs
EDIT:
As Jeff
mentioned in comment, then the best is convert column to categorical
mainly because less memory usage:
df['col'] = df['col'].astype("category")
Timings:
It is interesting, in large df pandas
is faster as numpy
. I cant believe it.
len(df)=500k
:
In [29]: %timeit (a(df1))
100 loops, best of 3: 9.27 ms per loop
In [30]: %timeit (a1(df2))
100 loops, best of 3: 9.32 ms per loop
In [31]: %timeit (b(df3))
10 loops, best of 3: 24.6 ms per loop
In [32]: %timeit (b1(df4))
10 loops, best of 3: 24.6 ms per loop
len(df)=5k
:
In [38]: %timeit (a(df1))
1000 loops, best of 3: 274 μs per loop
In [39]: %timeit (a1(df2))
The slowest run took 6.71 times longer than the fastest. This could mean that an intermediate result is being cached.
1000 loops, best of 3: 273 μs per loop
In [40]: %timeit (b(df3))
The slowest run took 5.15 times longer than the fastest. This could mean that an intermediate result is being cached.
1000 loops, best of 3: 295 μs per loop
In [41]: %timeit (b1(df4))
1000 loops, best of 3: 294 μs per loop
len(df)=5
:
In [46]: %timeit (a(df1))
1000 loops, best of 3: 206 μs per loop
In [47]: %timeit (a1(df2))
1000 loops, best of 3: 204 μs per loop
In [48]: %timeit (b(df3))
The slowest run took 6.30 times longer than the fastest. This could mean that an intermediate result is being cached.
10000 loops, best of 3: 164 μs per loop
In [49]: %timeit (b1(df4))
The slowest run took 6.44 times longer than the fastest. This could mean that an intermediate result is being cached.
10000 loops, best of 3: 164 μs per loop
Code for testing:
d = {'col': ["baked","beans","baked","baked","beans"]}
df = pd.DataFrame(data=d)
print (df)
df = pd.concat([df]*100000).reset_index(drop=True)
#test for 5k
#df = pd.concat([df]*1000).reset_index(drop=True)
df1,df2,df3, df4 = df.copy(),df.copy(),df.copy(),df.copy()
def a(df):
df['col'] = pd.factorize(df.col)[0]
return df
def a1(df):
idx,_ = pd.factorize(df.col)
df['col'] = idx
return df
def b(df):
df['col'] = np.unique(df['col'],return_inverse=True)[1]
return df
def b1(df):
_,idx = np.unique(df['col'],return_inverse=True)
df['col'] = idx
return df
print (a(df1))
print (a1(df2))
print (b(df3))
print (b1(df4))
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…