2016-03-12 107 views
1

我的DataFrame是94列728k行。每个值都是表示颜色的字符串。我打算将每种颜色转换为相应的数值。熊猫:有效地改变多个列中的多个值

这是一个可重现的例子。在这个例子中,我希望将字符串转换如下:

blue = 1 
green = 2 
red = 3 
grey = 4 
orange = 5 

data = {'group1': ['red', 'grey', 'blue', 'orange'], 
    'group2': ['red', 'green', 'blue', 'blue'], 
    'group3': ['orange', 'blue', 'orange', 'green']} 

data = pd.DataFrame(data) 
data 

    group1 group2 group3 
0 red  red  orange 
1 grey green blue 
2 blue blue orange 
3 orange blue green 

输出将是:

group1 group2 group3 
0  3  3  5 
1  4  2  1 
2  1  1  5 
3  5  1  2 

我怎么能这样做有效地给予我的实际数据的大小?

+1

可能不是你在寻找什么,但看看sklearn.preprocessing.LabelEncoder为好。 http://scikit-learn.org/stable/modules/generated/sklearn.preprocessing.LabelEncoder.html – ayhan

回答

3

你可以先使用字典的字符串映射到整数:

d = {'blue': 1, 'green': 2, 'red': 3, 'grey': 4, 'orange': 5} 

然后使用replace并传入词典:

>>> data.replace(d) 
    group1 group2 group3 
0  3  3  5 
1  4  2  1 
2  1  1  5 
3  5  1  2 

一本字典,让您可以挑选的优势哪些字符串映射到哪些整数。如果您不介意为您自动生成的值,则可以利用熊猫的categorical数据类型。

理想情况下,我们会写data.astype('category')并从那里开始,但从0.17.1开始,不执行二维分类转换。

一个解决办法是堆栈,施放,拆散:

>>> c_data = data.stack().astype('category') 
>>> c_data.cat.codes.unstack() 
    group1 group2 group3 
0  4  4  3 
1  2  1  0 
2  0  0  3 
3  3  0  1 
+1

你可以明确地传递类别时,风格分类,以及得到任何数字代码你想 – Jeff