2011-10-18 20 views
10

previous question'a çok benzer bir şey yapmaya çalışıyorum ancak hatayla karşılaşıyorum.Dize dizisini (kategori) bir pandalar veri kümesinden int dizisine dönüştürme

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

sonra var:

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 

çıkış Ben bir makine öğrenme nesnesine özellikler ve etiket değişkeni göndermek için bazı çevirim yapmayı yapmanız gereken özellikler ve etiketi içeren pandalar dataframe var konsol ilk verir:

:

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]] 

sonra aşağıdaki hatayı karşılamak

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' 

Veri türü içindeki 'type' kategori değişkenini int? 'type', 'single', 'touch', 'nuclei', 'dusts' değerlerini alabilir ve 0, 1, 2, 3 gibi int değerleriyle dönüştürmem gerekir.

cevap

10

Eğer dizeleri vektörünüz varsa

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) 

budur:

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] 

faktör özelliklerini labels ve levels vardır: ya bunu kategorik etiketleri vermek isteyen diğer nesneler ve, siz (pandas ad alanında mevcut) Factor sınıfını kullanabilirsiniz 1D vektörleri için amaçlanmıştır Sorununuza anında uygulanabileceğinden emin değil, ama bir göz atın.

BTW Çoğu kullanıcı sık sık SO kullanıcısı olmadığından, bu soruları statsmodels ve/veya scikit-learning posta listesine sormanızı öneririz.

+4

Bu yazı yapıldıktan sonra Faktör sınıfı değiştirildiğini düşünüyorum. Gönderdiğiniz kodu çalıştırmaya çalıştığımda, Faktör'ün 3 argüman beklediğini ve 2 mesajın verildiğini belirten bir hata alıyorum. Faktör belgelerine bakıldığında, kurucunun beklediği şey şöyledir: {{{Faktör (öz, etiketler, seviyeler, isim = Hiçbiri)}}}. Gönderinizden, etiketlerin ve seviyelerin otomatik olarak serilerden hesaplandığını varsaydım, ancak Factor'un bunların Faktör'e geçmesini beklediği görülüyor. – CadentOrange

+10

Faktör, paganlarda kategorik olarak yeniden adlandırıldı 0.8.0 (6/2012) – smci

6

Pandas 0.10.1 sorusunu yanıtlıyorum. Factor.from_array hile yapmak gibi görünüyor.

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

önceki cevaplar işte Pandalar sürümü 0.18.1 ile çalışır numaralara haritalama dizeleri için bir çözümdür, modası geçmiş bulunmaktadır. Bir Serisi İçin

:

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') 

bir DataFrame için:

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 
İlgili konular