整数

2016-04-13 11 views
2

でパンダのデータフレームの文字列要素を交換私はパンダのデータフレームがあります。私が持っているデータがはるかに大きい現実に整数

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_axis y_axis data 
0 Cheese farms  4 
1 wales Cheese  3 

次のコードで生成することができますxy axisはヒートマップのラベルです。これらのラベルはしばしばかなり大きいので、それらを列挙してインデックスに置き換えたいとします(xy axesの両方にある、つまりcheese1の場合は,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

categorical variablesが必要です。その後、

あなたが複数の列の値を変換したいので、あなたがシリーズに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(SO 'チーズ' = 0、 '農場' = 1、 'ウェールズ' = 2):

>>> s.cat.categories 
Index(['Cheese', 'farms', 'wales'], dtype='object')