2011-10-18 40 views
10

Tôi đang cố gắng làm điều gì đó rất giống với previous question nhưng tôi gặp lỗi. Tôi có một dataframe gấu trúc chứa các tính năng và nhãn Tôi cần phải làm một số chuyển đổi để gửi các tính năng và biến nhãn vào một đối tượng học máy:Chuyển đổi mảng chuỗi (danh mục) thành mảng int từ một khung dữ liệu gấu trúc

import pandas 
import milk 
from scikits.statsmodels.tools import categorical 

sau đó tôi có:

trainedData=bigdata[bigdata['meta']<15] 
untrained=bigdata[bigdata['meta']>=15] 
#print trainedData 
#extract two columns from trainedData 
#convert to numpy array 
features=trainedData.ix[:,['ratio','area']].as_matrix(['ratio','area']) 
un_features=untrained.ix[:,['ratio','area']].as_matrix(['ratio','area']) 
print 'features' 
print features[:5] 
##label is a string:single, touching,nuclei,dust 
print 'labels' 

labels=trainedData.ix[:,['type']].as_matrix(['type']) 
print labels[:5] 
#convert single to 0, touching to 1, nuclei to 2, dusts to 3 
# 
tmp=categorical(labels,drop=True) 
targets=categorical(labels,drop=True).argmax(1) 
print targets 

Sản lượng console mang đầu tiên:

features 
[[ 0.38846334 0.97681855] 
[ 3.8318634 0.5724734 ] 
[ 0.67710876 1.01816444] 
[ 1.12024943 0.91508699] 
[ 7.51749674 1.00156707]] 
labels 
[[single] 
[touching] 
[single] 
[single] 
[nuclei]] 

tôi gặp thì báo lỗi sau:

Traceback (most recent call last): 
File "/home/claire/Applications/ProjetPython/projet particule et objet/karyotyper/DAPI-Trainer02-MILK.py", line 83, in <module> 
tmp=categorical(labels,drop=True) 
File "/usr/local/lib/python2.6/dist-packages/scikits.statsmodels-0.3.0rc1-py2.6.egg/scikits/statsmodels/tools/tools.py", line 206, in categorical 
tmp_dummy = (tmp_arr[:,None]==data).astype(float) 
AttributeError: 'bool' object has no attribute 'astype' 

Có thể chuyển đổi loại danh mục 'loại' trong khung dữ liệu thành int không? 'loại' có thể lấy giá trị 'đơn', 'chạm', 'hạt nhân', 'bụi' và tôi cần chuyển đổi với giá trị int như 0, 1, 2, 3.

Trả lời

10

Nếu bạn có vectơ dây hoặc các đối tượng khác và bạn muốn cung cấp cho nó nhãn phân loại, bạn có thể sử dụng lớp Factor (có sẵn trong không gian tên pandas):

In [1]: s = Series(['single', 'touching', 'nuclei', 'dusts', 'touching', 'single', 'nuclei']) 

In [2]: s 
Out[2]: 
0 single 
1 touching 
2 nuclei 
3 dusts 
4 touching 
5 single 
6 nuclei 
Name: None, Length: 7 

In [4]: Factor(s) 
Out[4]: 
Factor: 
array([single, touching, nuclei, dusts, touching, single, nuclei], dtype=object) 
Levels (4): [dusts nuclei single touching] 

Yếu tố có thuộc tính labelslevels:

In [7]: f = Factor(s) 

In [8]: f.labels 
Out[8]: array([2, 3, 1, 0, 3, 2, 1], dtype=int32) 

In [9]: f.levels 
Out[9]: Index([dusts, nuclei, single, touching], dtype=object) 

Đây là dành cho vector 1D s o không chắc chắn nếu nó có thể được áp dụng ngay lập tức cho vấn đề của bạn, nhưng có một cái nhìn.

BTW Tôi khuyên bạn nên hỏi những câu hỏi này trên bảng thống kê mô hình và/hoặc danh sách gửi thư scikit-learning vì hầu hết chúng ta không phải là người dùng SO thường xuyên.

+4

Tôi nghĩ rằng lớp Yếu tố đã được thay đổi kể từ khi bài viết này được thực hiện. Khi tôi cố gắng chạy mã bạn đã đăng, tôi nhận được thông báo lỗi rằng Factor mong đợi 3 đối số và 2 đối số đã được đưa ra. Nhìn vào tài liệu cho Factor, đây là những gì constructor mong đợi: {{{Factor (self, labels, levels, name = None)}}}. Từ bài viết của bạn, tôi giả định rằng các nhãn và các cấp đã được tự động tính toán từ chuỗi, nhưng có vẻ như Factor hy vọng chúng sẽ được chuyển vào Factor. – CadentOrange

+10

Yếu tố đã được đổi tên thành Phân loại trong gấu trúc 0.8.0 (6/2012) – smci

6

Tôi trả lời câu hỏi cho Pandas 0.10.1. Factor.from_array dường như làm điều này.

>>> s = pandas.Series(['a', 'b', 'a', 'c', 'a', 'b', 'a']) 
>>> s 
0 a 
1 b 
2 a 
3 c 
4 a 
5 b 
6 a 
>>> f = pandas.Factor.from_array(s) 
>>> f 
Categorical: 
array([a, b, a, c, a, b, a], dtype=object) 
Levels (3): Index([a, b, c], dtype=object) 
>>> f.labels 
array([0, 1, 0, 2, 0, 1, 0]) 
>>> f.levels 
Index([a, b, c], dtype=object) 
16

Câu trả lời trước đây là lỗi thời, vì vậy đây là giải pháp để ánh xạ chuỗi tới các số hoạt động với phiên bản 0.18.1 của Pandas.

Đối với một Series:

In [1]: import pandas as pd 
In [2]: s = pd.Series(['single', 'touching', 'nuclei', 'dusts', 
         'touching', 'single', 'nuclei']) 
In [3]: s_enc = pd.factorize(s) 
In [4]: s_enc[0] 
Out[4]: array([0, 1, 2, 3, 1, 0, 2]) 
In [5]: s_enc[1] 
Out[5]: Index([u'single', u'touching', u'nuclei', u'dusts'], dtype='object') 

Đối với một DataFrame:

In [1]: import pandas as pd 
In [2]: df = pd.DataFrame({'labels': ['single', 'touching', 'nuclei', 
         'dusts', 'touching', 'single', 'nuclei']}) 
In [3]: catenc = pd.factorize(df['labels']) 
In [4]: catenc 
Out[4]: (array([0, 1, 2, 3, 1, 0, 2]), 
     Index([u'single', u'touching', u'nuclei', u'dusts'], 
     dtype='object')) 
In [5]: df['labels_enc'] = catenc[0] 
In [6]: df 
Out[4]: 
     labels labels_enc 
    0 single   0 
    1 touching   1 
    2 nuclei   2 
    3  dusts   3 
    4 touching   1 
    5 single   0 
    6 nuclei   2 
Các vấn đề liên quan