2015-12-17 99 views
4

我試圖把字符串列到整數標識符...我無法找到大熊貓(或Python)這樣的一種優雅的方式。在下面的例子中,我改造「A」,這是一個字符串通過映射列/變量插入數字,但它看起來像一個骯髒的黑客我談到字符串的列到整數列熊貓

import pandas as pd                    
import numpy as np 

df = pd.DataFrame({'A': ['homer_simpson', 'mean_street', 'homer_simpson', 'bla_bla'], 'B': 4}) 

unique = df['A'].unique() 
mapping = dict(zip(unique, np.arange(len(unique)))) 

new_df = df.replace({'A': mapping}) 

是否有更好,更直接,方式實現這一目標?

回答

5

怎麼樣使用factorize

>>> labels, uniques = df.A.factorize() 
>>> df.A = labels 
>>> df 
    A B 
0 0 4 
1 1 4 
2 0 4 
3 2 4 

http://pandas.pydata.org/pandas-docs/version/0.17.1/generated/pandas.factorize.html

+0

幹得好。從來沒有聽說過的'factorize'.'%timeit標籤,唯一= df.A.factorize() 10000環路,最好的3:每次循環89微秒 %timeit df.A.map({VAL:N爲N, val in枚舉(df ['A']。unique())}) 1000循環,最好是3:每循環363μs – Alexander

0

假設你不那麼在意什麼的整數是,僅僅是有一個一致的映射,你可以(1)使用的範疇代碼或(2)位居值:

>>> df["A_categ"] = pd.Categorical(df.A).codes 
>>> df["A_rank"] = df["A"].rank("dense").astype(int) 
>>> df 
       A B A_categ A_rank 
0 homer_simpson 4  1  2 
1 mean_street 4  2  3 
2 homer_simpson 4  1  2 
3  bla_bla 4  0  1 
1

一個簡單的轉換字典映射應該可以得到你想要的。字典中的所有值都是唯一的,因此調換它不會導致重複的密鑰。

df['A'] = df.A.map({val: n for n, val in enumerate(df['A'].unique())}) 

>>> df 
    A B 
0 0 4 
1 1 4 
2 0 4 
3 2 4 
0

很抱歉,但我沒有足夠的信譽分置評(這裏newbee)。只是想知道如果使用Dataframe加入將會像這樣更快:

df.merge(df.drop_duplicates().reset_index(),on="A")["index"]