我在想熊貓有沒有什麼功能可以讓我做到這一點。將訂購的水平轉換爲熊貓數字
我有一個列的級別[低,中,高]。
我想將它們翻譯爲[1,2,3]以執行線性迴歸。但是,我目前正在做的是df[df['interest_level'] == 'low'] = 1
。有沒有更好的方法來做到這一點?
謝謝。
我在想熊貓有沒有什麼功能可以讓我做到這一點。將訂購的水平轉換爲熊貓數字
我有一個列的級別[低,中,高]。
我想將它們翻譯爲[1,2,3]以執行線性迴歸。但是,我目前正在做的是df[df['interest_level'] == 'low'] = 1
。有沒有更好的方法來做到這一點?
謝謝。
使用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
您可以使用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
我認爲有問題的預測,你需要'高'到'3',低到'1',因爲它取決於列的順序。首先,它被轉換爲0,然後是1,最後轉換爲2. – jezrael
@jezrael,AFIK這些值不起什麼作用 - 主要問題是迴歸/分類方法通常不接受非數字dtypes ... – MaxU
是的,這取決於OP。如果只需要轉換爲數字並且映射不是必需的,那麼可以使用您的解決方案。但是如果值的順序改變了,映射將會不同。所以不可能預測它。 – jezrael