Sklearn将字符串类标签更改为int

时间:2017-02-18 21:23:24

标签: python pandas scikit-learn

我有一个pandas数据帧,我正在尝试将字符串表示的给定列中的值更改为整数。例如:

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

3 个答案:

答案 0 :(得分:4)

您可以使用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

答案 1 :(得分:3)

使用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

答案 2 :(得分:2)

您可以使用sklearn.preprocessing

from sklearn import preprocessing

le = preprocessing.LabelEncoder()
le.fit(df.fruit)
df['categorical_label'] = le.transform(df.fruit)

将标签转换回原始编码。

le.inverse_transform(df['categorical_label'])