2016-11-11 3 views
1

У меня есть dataframe, что имеет столбец «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] 

Но это присваивает значение 0, B 2, и АА 1. Я хочу АА быть назначены на 2 и B 1.

Я искал способы сделать это и ничего не нашел. Есть ли способ сделать это?

+1

я думаю, что вы хотите: 'ф.р. [0] = D [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

Смежные вопросы