2016-05-25 21 views
15

Sütunlardan birinin kategorik bir değişken içerdiği bir dizi veri çerçevem ​​var. Birkaç kukla değişkene dönüştürmek istiyorum, bu durumda normalde get_dummies kullanıyorum. Ne olur? get_dummies, ne kadar kategoriye sahip olduğunu bulmak ve böylece uygun sayıda sahte değişkenler oluşturmak için her bir veri çerçevesindeki veriyi inceler. Bu, get_dummies. Ancak, şu anda çalışmakta olduğum problemde, aslında mümkün olan kategorilerin ne olduğunu biliyorum. Ancak her bir veriye ayrı ayrı bakıldığında, tüm kategoriler zorunlu olarak görünmez.Tüm kategoriler mevcut değilken kukla değişkenler

Soruma şudur: get_dummies (veya eşdeğer bir işlev) kategorilerinin adlarını geçmek için bir yol var, böylece belirli bir veri alanında görünmeyen kategoriler için, yalnızca bir 0s sütun? Bu kılacak

şey:

categories = ['a', 'b', 'c'] 

    cat 
1 a 
2 b 
3 a 

bu ol:

cat_a cat_b cat_c 
1 1  0  0 
2 0  1  0 
3 1  0  0 
+0

eğitim veri kümesi bulunan ancak deney veri kümesindeki kategorisinde kaynaklanan sütunu kaldırmak

# Get missing columns in the training test missing_cols = set(train.columns) - set(test.columns) # Add a missing column in test set with default value equal to 0 for c in missing_cols: test[c] = 0 # Ensure the order of column in the test set is in the same order than in train set test = test[train.columns] 

Dikkat ettiyseniz ' sklearn.OneHotEncoder'. Bakın: http://scikit-learn.org/stable/modules/generated/sklearn.preprocessing.OneHotEncoder.html – ssm

+0

@ssm: 'get_dummies', çıktıdaki ek yararla birlikte" OneHotEncoder "ile aynı işlevselliği uygular Düz bir "ndarray" yerine etiketli sütunlarla anlaşılması kolay pandalar. –

+0

Soruyu yanlış anlamıştım. Teşekkürler! – ssm

cevap

15

aktarılması ve

import pandas as pd 

cats = ['a', 'b', 'c'] 
df = pd.DataFrame({'cat': ['a', 'b', 'a']}) 

dummies = pd.get_dummies(df, prefix='', prefix_sep='') 
dummies = dummies.T.reindex(cats).T.fillna(0) 

print dummies 

    a b c 
0 1.0 0.0 0.0 
1 0.0 1.0 0.0 
2 1.0 0.0 0.0 
+0

Temizle ve özlü, teşekkürler değil! – Berne

+0

, "reindex" sütunları anahtar sözcüğünü kullanarak (i.e. 'dummies.reindex (columns = cats)'), çift geçişi yapmanıza gerek yoktur. –

+0

Ayrıca, "reindex", "fillna" ile yaptığınız şeyi yapan bir "fill_value" parametresine sahiptir. Böylece, sonucu yazdırmadan önce satır ile yapılabilir: 'dummies = dummies.reindex (sütunlar = kediler, fill_value = 0)'. –

2

Ben get_dummies kutunun dışında bu sağlar sanmıyorum, sadece vurgular ekstra column oluşturmak için olanak sağlar NaN değerleri.

eksik değerleri değiştirmek için fillna(0) kullanın eksik sütunlar oluşturmak otomatik 'yığın' DataFrames (kukla sütunlar artı DataFrame id) dikey için axis=0 boyunca pd.concat kullanıp olabilir, eksik columns kendinizi ekleyin ve sonra kullanmak için Çeşitli DataFrame'u tekrar ayırmak için .groupby('id').

+0

Evet, düşündüğüm bir alternatif bu, ama daha önce kullanılması gereken bir şey olabileceğini umuyordum (mutlaka get_dummies ile değil, ama bulduğum diğer alternatif "sklearn" idi. OneHotEncoder' da çok yardımcı görünmüyor ... – Berne

+0

Sadece "get_dummies" ifadesini atlayabilir ve kategori sütununun kendisinden yola çıkarak tüm "0'-'1" sütunlarını oluşturabilirsiniz. Sanırım sorunun büyüklüğüne bağlı. – Stefan

4

bu deneyin:

In[1]: import pandas as pd 
     cats = ["a", "b", "c"] 

In[2]: df = pd.DataFrame({"cat": ["a", "b", "a"]}) 

In[3]: pd.concat((pd.get_dummies(df.cat, columns=cats), pd.DataFrame(columns=cats))).fillna(0) 
Out[3]: 
    a b c 
0 1.0 0.0 0 
1 0.0 1.0 0 
2 1.0 0.0 0 
+0

'get_dummies' içindeki' sütunlar = kediler 'burada aslında hiçbir şey yapmıyor. 'Sütun' seçeneği, kukla değişkenlerle kodlanmasını istediğiniz orijinal veri çerçevesinin bir alt grubunu seçmek içindir. İstenen sütunlar veri çerçevesinde görünmüyorsa göz ardı edilir gibi görünüyor. Bir hata üretmesi gerekiyor gibi görünüyor, ama –

23

get_dummies geçmek için bir yol (veya eşdeğer bir fonksiyonu) kategorilerinin isimleri var reindex kullanarak, böylece Belirli bir veri alanında görünmeyen kategoriler için, yalnızca 0'lık bir sütun oluşturur mu?

Evet, var! Pandaların sadece categorical data için özel bir Serileri vardır. Bu serinin özelliklerinden biri, get_dummies'un hesaba kattığı olası kategorilerdir. İşte bir örnek: Sonra

In [1]: import pandas as pd 

In [2]: cat=pd.Series(list('aba'),index=range(1,4)) 

In [3]: cat=cat.astype('category',categories=list('abc')) 

In [4]: cat 
Out[4]: 
1 a 
2 b 
3 a 
dtype: category 
Categories (3, object): [a, b, c] 

, get_dummies istediğini tam olarak yapacağız!

In [5]: pd.get_dummies(cat) 
Out[5]: 
    a b c 
1 1 0 0 
2 0 1 0 
3 1 0 0 

bir kategorik Series veya DataFrame oluşturmak için başka yollar bir sürü vardır, bu şimdiye en uygun bulmak sadece bir tanesidir. Bunların hepsini the pandas documentation'da okuyabilirsiniz.

DÜZENLEME: Ben tam sürüm izledi ancak pandalar en azından sürümü 0.17.0 kadar seyrek matrisler nasıl davrandığı bir bug vardı değil

. Sürüm 0.18.1 ile düzeltildi. Eğer bir DataFrame ile sparse=True seçeneğiyle bunu denerseniz

sürümü 0.17.0 için, eksik kukla değişken için sıfır sütun NaN bir sütun olacak ve o yoğun dönüştürülür. test kümesi eksik Kategori ekleniyor

+0

Güzel, Pandalar'daki bu veri tipini bilmiyordum, teşekkürler! – Berne

+4

@Berne Bunun biraz kaba olabileceğini biliyorum ama ... Cevabım, sorunuza şu anda kabul edilen olandan daha iyi cevap verdiğini düşünüyorum. Benimkini kabul edilen cevaba değiştirebilmen için bir şansın var mı? –

+0

Uh, peki, piRSquared'in cevabını seçtim çünkü açık, özlü ve zaten sahip olduğum koda uyarlanmıştı. Artı, yaptığım şeyi kullanarak bittiğim şeydi, bu yüzden bir şekilde sorunumu çözen şeydi. Seninki daha fazla * bilgilendirici * bir bütün olarak verildi, ama sonunda kullandıklarım değil, bu yüzden seninkine değiştirmedim, pardon ... Eğer yapabilirsem bonus puanları verirdim. – Berne

0

: bu kod da aradığınız

İlgili konular