2016-04-13 8 views
2

у меня есть панд dataframe:Замена строковых элементов панда DataFrame с целыми числами

x_axis y_axis data 
0 Cheese farms  4 
1 wales Cheese  3 

Это может быть сгенерировано с помощью следующего кода:

import pandas 
cols=['x_axis','y_axis','data'] 
row1=['Cheese','farms',4] 
row2=['wales','Cheese',3] 
data=pandas.DataFrame([row1,row2],columns=cols) 
print data 

В действительности данных у меня есть намного больше и x и y axis являются ярлыками к карте тепла. Поскольку эти метки часто довольно большие, я хочу, чтобы перечислить их и заменить их с индексом (по обеим x и y axes т.е. так, если cheese является 1 в x также 1 в y axis). Я также должен иметь возможность написать легенду, которая отображает новые индексы в их исходные значения.

Нужный вывод может выглядеть примерно так:

x_axis y_axis data 
0  1  2  4 
1  3  1  3 

Тогда легенда будет:

cheese=1 
farms=2 
wales=3 

Может кто-нибудь дать мне несколько советов о том, как это сделать программно?

+0

Вы отображение может не быть полностью понятно. Что произойдет, если у вас есть дубликаты, например, дополнительная строка row3 = ['Bread', 'wales', 3]? – tfv

+0

Привет, tfv, поэтому «хлеб» всегда будет 4 (например), а уэльс всегда 5 - независимо от колонки – CiaranWelsh

ответ

1

Необходимо .

Потому что вы хотите, чтобы преобразовать значения в нескольких столбцах, вам необходимо stack() в ряд, а затем вызвать astype:

>>> s = df.loc[:, ['x_axis', 'y_axis']].stack().astype('category') 
>>> s 
0 x_axis Cheese 
    y_axis  farms 
1 x_axis  wales 
    y_axis Cheese 
dtype: category 
Categories (3, object): [Cheese, farms, wales] 

s теперь серии с категорическими типов: каждая уникальная строка преобразуется в целое число ,

Если вы используете аксессуар .cat, вы можете получить целочисленный код каждой категориальной переменной. Использование unstack() даст вам обратно DataFrame:

>>> s.cat.codes.unstack() 
    x_axis y_axis 
0  0  1 
1  2  0 

Это означает, что вы можете присвоить эти целые столбцы обратно в исходных столбцов со следующим:

>>> df.loc[:, ['x_axis', 'y_axis']] = s.cat.codes.unstack() 
>>> df 
    x_axis y_axis data 
0  0  1  4 
1  2  0  3 

Отображение строк до целых чисел задается s.cat.categories в виде индекса (так 'Сыр' = 0, 'фермы' = 1, 'Wales' = 2):

>>> s.cat.categories 
Index(['Cheese', 'farms', 'wales'], dtype='object') 
Смежные вопросы