2017-04-26 29 views
2

在Pandas DataFrame中,如何將表示分類特徵的列(例如,一天是工作日還是週末)以序號形式表示(例如,1表示工作日,2表示週末),以便它以分類的方式表示值,例如工作日的(0,1)和週末的(1,0),所以這些值不具有可比性?如何將序數值轉換爲分類值?

有替代使用pd.get_dummies(或OneHotEncoder),這將創建兩個列與0和1s,然後合併兩列在元組中,但沒有直接的方式做到這一點?

例子: 我:

datetime temp daytype 
0 2011-01-01 9.84 2 
1 2011-01-02 9.02 2 
2 2011-01-03 9.02 1 
3 2011-01-04 9.84 1 
4 2011-01-05 9.84 1 
5 2011-01-06 9.84 1 

我想:

datetime temp daytype 
0 2011-01-01 9.84 (1, 0) 
1 2011-01-02 9.02 (1, 0) 
2 2011-01-03 9.02 (0, 1) 
3 2011-01-04 9.84 (0, 1) 
4 2011-01-05 9.84 (0, 1) 
5 2011-01-06 9.84 (0, 1) 

(我開始想,也許我得到它錯了 - 這是不是默認的方式代表絕對值?)

+1

你是否看到[分類數據文檔](http://pandas.pydata.org/pandas-docs/stable/categorical.html) ? – languitar

+1

我想你需要'df ['daytype'] = df ['daytype']。astype('category')' – jezrael

+0

是的,astype或dtype也是從文檔中推薦的。我相信我(錯誤地)在尋找一種實際可視化的方式來表示這些值不具有可比性。 – Ioanna

回答

1

您可以創建自己的假人/一貼熱載體中,然後將它們組合成一個元組:

你的原始數據看起來像這樣

import pandas as pd 
df = pd.DataFrame({"daytype": [2, 2, 1, 1, 1, 2]}) 
print(df) 

    daytype 
0  2 
1  2 
2  1 
3  1 
4  1 
5  2 

我們可以創建虛擬變量,正如你正確地指出,將導致不同的列:

dummies = pd.get_dummies(df["daytype"]).astype(int) 
print(dummies) 

    1 2 
0 0 1 
1 0 1 
2 1 0 
3 1 0 
4 1 0 
5 0 1 

但隨後你們可以一起把這些單獨的列和它們壓縮,並將結果指定追溯到在原始列:

df["combined"] = list(zip(dummies[1], dummies[2])) 

給你:

print(df) 

    daytype combined 
0  2 (0, 1) 
1  2 (0, 1) 
2  1 (1, 0) 
3  1 (1, 0) 
4  1 (1, 0) 
5  2 (0, 1) 

當然,你完全可以用組合取代原來的列,如果你想,我只是把他們分開爲清楚起見

上述會給你想要的結果,你但是你也可以直接設置評論中提到的特定列的類型:

df['daytype'] = df['daytype'].astype('category') 

最終它會回到你想要使用該列做什麼

+0

是的,get_dummies + merge會給我我想要的,但我想知道是否有一些編碼器直接做到這一點:D。謝謝。 – Ioanna

+0

我可能是錯的,但我不認爲他們會直接給你,因爲我不能想到代表某種類別的情況。你打算用新的組合專欄做什麼? – Simon

+0

我正計劃在轉換後的數據幀上運行線性迴歸。 – Ioanna

2

以下是一種方法:df['daytype'] = df['daytype'].apply(lambda x : (1, 0) if x == 2 else (0,1))

相關問題