2016-11-05 2 views
3

Я могу преобразовать все текстовые функции в кадр данных pandas путем кастинга в категорию с помощью метода df.astype(), как показано ниже. Однако я считаю категории трудно работать (например, для построения данных) и предпочли бы, чтобы создать новый столбец целых чиселpandas преобразует текстовую функцию в числовое значение

#convert all objects to categories 
object_types = dataset.select_dtypes(include=['O']) 
for col in object_types: 
    dataset['{0}_category'.format(col)] = dataset[col].astype('category') 

я могу преобразовать текст в целые числа с помощью этого хака:

#convert all objects to int values 
object_types = dataset.select_dtypes(include=['O']) 

new_cols = {} 
for col in object_types: 
    data_set = set(dataset[col].tolist()) 
    data_indexed = {} 
    for i, item in enumerate(data_set): 
     data_indexed[item] = i 
    new_list = [] 
    for item in dataset[col].tolist(): 
     new_list.append(data_indexed[item]) 
    new_cols[col]=new_list 

for key, val in new_cols.items(): 
    dataset['{0}_int_value'.format(key)] = val 

Но есть ли лучший (или существующий) способ сделать то же самое?

+0

Я бы переключите свой ответ на ответ MaxU. Это более уместно. – piRSquared

ответ

3

Я хотел бы использовать factorize метод, который предназначен для данной конкретной задачи:

In [90]: x 
Out[90]: 
    A B 
9 c z 
10 c z 
4 b x 
5 b y 
1 a w 
7 b z 

In [91]: x.apply(lambda col: pd.factorize(col, sort=True)[0]) 
Out[91]: 
    A B 
9 2 3 
10 2 3 
4 1 1 
5 1 2 
1 0 0 
7 1 3 

или:

In [92]: x.apply(lambda col: pd.factorize(col)[0]) 
Out[92]: 
    A B 
9 0 0 
10 0 0 
4 1 1 
5 1 2 
1 2 3 
7 1 0 
2

считают df

df = pd.DataFrame(dict(A=list('aaaabbbbcccc'), 
         B=list('wwxxxyyzzzzz'))) 

df 

enter image description here

вы можете преобразовать в целые числа, как этот

def intify(s): 
    u = np.unique(s) 
    i = np.arange(len(u)) 
    return s.map(dict(zip(u, i))) 

или сокращенный вариант

def intify(s): 
    u = np.unique(s) 
    return s.map({k: i for i, k in enumerate(u)}) 

df.apply(intify) 

Или в одной строке

df.apply(lambda s: s.map({k:i for i,k in enumerate(s.unique())})) 

enter image description here

+0

Я попытался применить как метод intify, так и лямбда-функцию к фреймворку данных и после печати .head для фреймворка данных до и после приложения, dataframe не изменился (все еще строки не ints) –

+0

@DonSmythe вы должны вернуть результаты в dataframe , В моем случае 'df = df.apply (intify)' – piRSquared

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