2016-11-11 55 views
1

因式分解我有有一欄「cat100」有類似下面的值數據框:大熊貓如何在不尋常的字符串順序

「A」「B」 ...「Y」「Z」「AA ''AB'...

我想使用pd.factorize來分解列,使得AA在'B''C'...'Z'之後。

我已經試過類似:

df = pd.DataFrame(['A','B','AA']) 
df[0] = pd.factorize(df[0], sort=True)[0] 

但這A分配給0,B爲2,AA爲1。我想AA被分配到2和B 1

我已經搜索了方法來做到這一點,並沒有找到任何東西。有沒有辦法做到這一點?

+1

我想你想:'DF [0] = DF [0] .astype( '類')' – MaxU

回答

2

考慮具有字符串列一個DF如圖所示:

df = pd.DataFrame(dict(col=['A','B','AA','C','BB','AAA','BC','AB','AA'])) 
df 

enter image description here

自定義功能:

(ⅰ)以唯一條目從柱下考慮。
(ii)Groupby按字符串長度排列並按字典順序排列並水平堆疊。 (iii)因式分解它們。

def complex_factorize(df, col): 
    ser = pd.Series(df[col].unique()) 
    func = lambda x: sorted(x.values.ravel()) 
    arr = np.hstack(ser.groupby(ser.str.len()).apply(func).values) 
    return pd.factorize(arr) 

以標籤和由factorize方法返回的系列的唯一的元件,其饋送到DF.replace構建映射。

val, ser = complex_factorize(df, 'col') 
df.replace(ser, val) 

enter image description here