2017-03-01 57 views
1

我在想熊貓有沒有什麼功能可以讓我做到這一點。將訂購的水平轉換爲熊貓數字

我有一個列的級別[低,中,高]。

我想將它們翻譯爲[1,2,3]以執行線性迴歸。但是,我目前正在做的是df[df['interest_level'] == 'low'] = 1。有沒有更好的方法來做到這一點?

謝謝。

回答

2

使用pd.factorize()方法:

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

你也可以分類您的新的數字值(這可能會節省大量的內存):

樣品數據框:

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

我認爲有問題的預測,你需要'高'到'3',低到'1',因爲它取決於列的順序。首先,它被轉換爲0,然後是1,最後轉換爲2. – jezrael

+0

@jezrael,AFIK這些值不起什麼作用 - 主要問題是迴歸/分類方法通常不接受非數字dtypes ... – 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