2016-09-27 1 views
2

Есть ли лучший способ (в смысле минимального кода), который может сделать следующее: преобразовать столбец перечисленных числовых значений, так что должны идти несколько так:Преобразование данных столбца в перечисленной словаре ключ-значение

  1. получить набор элементов в столбцах
  2. сделать enumrated словарь с ключевым значением
  3. вернуть ключ со значением
  4. использования результата ключ-значение вместо данные в новом столбце.

Так вот, что я делаю сегодня, и интересно, если кто-нибудь может показать классический способ сделать это, так что я могу избежать написания функции get_color_val:

import pandas as pd 
cars = pd.DataFrame({"car_name": ["BMW","BMW","ACCURA","ACCURA","ACCURA","BMW","BMW","BMW"],"color":["RED","RED","RED","RED","GREEN","BLACK","BLUE","BLUE"]}) 

color_dict = dict(enumerate(set(cars["color"]))) 
color_dict = dict((y,x) for x,y in color_dict.iteritems()) 

def get_color_val(row): 
    my_key = row["color"] 
    my_value = color_dict.get(my_key) 
    return my_value 

cars["color_val"] = cars.apply(get_color_val, axis=1) 
cars = cars.drop("color",1) 
print cars 

Результат

Before------------ 
car_name color 
0  BMW RED 
1  BMW RED 
2 ACCURA RED 
3 ACCURA RED 
4 ACCURA GREEN 
5  BMW BLACK 
6  BMW BLUE 
7  BMW BLUE 


After------------ 
car_name color_val 
0  BMW   3 
1  BMW   3 
2 ACCURA   3 
3 ACCURA   3 
4 ACCURA   2 
5  BMW   1 
6  BMW   0 
7  BMW   0 

ответ

3

В этом случае я бы использовал pd.factorize():

In [8]: cars['color_val'] = pd.factorize(cars.color)[0] 

In [9]: cars 
Out[9]: 
    car_name color color_val 
0  BMW RED   0 
1  BMW RED   0 
2 ACCURA RED   0 
3 ACCURA RED   0 
4 ACCURA GREEN   1 
5  BMW BLACK   2 
6  BMW BLUE   3 
7  BMW BLUE   3 
+0

В одной строке?!?!?! Вау, спасибо! – adhg

+0

@adhg, да, еще одна причина любить Панд ...;) – MaxU

Смежные вопросы