2017-02-18 8 views
2

У меня есть фрейм данных pandas, и я пытаюсь изменить значения в данном столбце, которые представлены целыми числами в целые числа. Например: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' является' категорией' по дизайну? 'print (type (pd.factorize (pd.Series (['apple', 'apple', 'orange', 'banana'])) [0]))' return 'numpy array' и [docs] (http: //pandas.pydata.org/pandas-docs/stable/reshaping.html#factorizing-values) (последнее примечание) описывают, как отличать категориальным - кажется, после 'factorize'. Или что-то не хватает? Благодарю. – 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