2017-02-18 59 views
2

我有一個熊貓數據框,我試圖更改給定列中由字符串表示爲整數的值。例如:Sklearn將字符串類標籤更改爲int

df = index fruit quantity price 
     0 apple   5 0.99 
     1 apple   2 0.99 
     2 orange   4 0.89 
     4 banana   1 1.64 
     ... 
    10023  kiwi   10 0.92 

我想它看:

df = index fruit quantity price 
     0  1   5 0.99 
     1  1   2 0.99 
     2  2   4 0.89 
     4  3   1 1.64 
     ... 
    10023  5   10 0.92 

我可以做到這一點使用

df["fruit"] = df["fruit"].map({"apple": 1, "orange": 2,...}) 

,如果我有一個小清單來改變其工作原理,但我我正在看一個有500多個不同標籤的專欄。有沒有辦法將這個從string更改爲int

回答

2

使用factorize,然後在必要時轉換爲categorical

df.fruit = pd.factorize(df.fruit)[0] 
print (df) 
    fruit quantity price 
0  0   5 0.99 
1  0   2 0.99 
2  1   4 0.89 
3  2   1 1.64 
4  3  10 0.92 

df.fruit = pd.Categorical(pd.factorize(df.fruit)[0]) 
print (df) 
    fruit quantity price 
0  0   5 0.99 
1  0   2 0.99 
2  1   4 0.89 
3  2   1 1.64 
4  3  10 0.92 

print (df.dtypes) 
fruit  category 
quantity  int64 
price  float64 
dtype: object 

此外,如果需要從1數:

df.fruit = pd.Categorical(pd.factorize(df.fruit)[0] + 1) 
print (df) 
    fruit quantity price 
0  1   5 0.99 
1  1   2 0.99 
2  2   4 0.89 
3  3   1 1.64 
4  4  10 0.92 
+0

categoricals定義比化;沒有理由直接做 – Jeff

+0

@Jeff - 我不明白 - 你認爲factorize的輸出是否是設計中的'category'? 'print(type)(pd.factorize(pd.Series(['apple','apple','orange','banana')))[0]))'return'numpy array' and [docs](http: //pandas.pydata.org/pandas-docs/stable/reshaping.html#factorizing-values)(最後一個註釋)描述瞭如何轉換爲分類 - 看起來是在「因數分解」之後。還是缺少什​​麼?謝謝。 – jezrael

+0

你根本不需要因式分解,只需投入分類並使用代碼;這些是因式分解:直接使用因式分解是沒有必要的 – Jeff

3

您可以使用factorize方法:

In [13]: df['fruit'] = pd.factorize(df['fruit'])[0].astype(np.uint16) 

In [14]: df 
Out[14]: 
    index fruit quantity price 
0  0  0   5 0.99 
1  1  0   2 0.99 
2  2  1   4 0.89 
3  4  2   1 1.64 
4 10023  3  10 0.92 

In [15]: df.dtypes 
Out[15]: 
index   int64 
fruit  uint16 
quantity  int64 
price  float64 
dtype: object 

或者你可以這樣來做:

In [21]: df['fruit'] = df.fruit.astype('category').cat.codes 

In [22]: df 
Out[22]: 
    index fruit quantity price 
0  0  0   5 0.99 
1  1  0   2 0.99 
2  2  3   4 0.89 
3  4  1   1 1.64 
4 10023  2  10 0.92 

In [23]: df.dtypes 
Out[23]: 
index   int64 
fruit   int8 
quantity  int64 
price  float64 
dtype: object