2017-03-01 11 views
1

パンダにはこれを可能にする機能があるのだろうかと思っていました。パンダの順序レベルを数値に変換

レベルが[低、中、高]の列があります。

[1,2,3]に変換して線形回帰を実行したいと思います。しかし、現在私がやっているのはdf[df['interest_level'] == 'low'] = 1です。これを行うより良い方法はありますか?

ありがとうございました。

答えて

2

使用pd.factorize()方法:あなたも、あなたの新しい数値を分類することができます

df['interest_level'] = pd.factorize(df['interest_level'])[0] 

は(これは多くのメモリを節約するかもしれません):

サンプルDATAFRAME:

In [34]: df = pd.DataFrame({'interest_level':np.random.choice(['medium','high','low'], 10)}) 

In [35]: df 
Out[35]: 
    interest_level 
0   high 
1   low 
2   medium 
3   high 
4   low 
5   high 
6   high 
7   low 
8   low 
9   medium 

ソリューション:

In [36]: df['interest_level'], cats = pd.factorize(df['interest_level']) 

In [37]: df['interest_level'] = pd.Categorical(df['interest_level'], categories=np.arange(len(cats))) 

In [38]: df 
Out[38]: 
    interest_level 
0    0 
1    1 
2    2 
3    0 
4    1 
5    0 
6    0 
7    1 
8    1 
9    2 

In [39]: cats  # this can be used for the backtracing ... 
Out[39]: Index(['high', 'low', 'medium'], dtype='object') 

In [40]: df.memory_usage() 
Out[40]: 
Index    80 
interest_level 34 # <---- NOTE: only 34 bytes used for 10 integers 
dtype: int64 

In [41]: df.dtypes 
Out[41]: 
interest_level category 
dtype: object 
+0

を私は問題があると思いますが、あなたが '高い必要がある予測します'to' 3'、lowから '1'になります。これは列の順序に依存するためです。まず、0に変換されてから1になり、最後に2になります。 – jezrael

+0

@jezrael、AFIKの値は大きな役割を果たさない - 主な問題は、回帰/分類方法はしばしば非数値のdtypeを受け入れないことです... – MaxU

+0

はい、それはOPによります。必要なのは数値に変換するだけで、マッピングは必要ない場合は、ソリューションを使用することができます。しかし、値の順序が変更された場合、マッピングは異なります。それを予測することは不可能です。 – jezrael

1

あなたがmapを使用することができます。

d = {'low':1,'medium':2,'high':3} 

df['interest_level'] = df['interest_level'].map(d) 

サンプル:

df = pd.DataFrame({'interest_level':['medium','high','low', 'low', 'medium']}) 
print (df) 
    interest_level 
0   medium 
1   high 
2   low 
3   low 
4   medium 

d = {'low':1,'medium':2,'high':3} 
df['interest_level'] = df['interest_level'].map(d) 
print (df) 
    interest_level 
0    2 
1    3 
2    1 
3    1 
4    2 

別の解決策は、Categoricalにキャストし、その後cat.codes使用されています

categories = ['low','medium','high'] 
df['interest_level'] = df['interest_level'].astype('category', 
                categories=categories, 
                ordered=True).cat.codes + 1 
print (df) 
    interest_level 
0    2 
1    3 
2    1 
3    1 
4    2 
関連する問題