2015-12-30 10 views
5

üzerine pandalar get_dummies açık sınırlar göstergelerini oluşturun, biz qcut sınırlarından açık sınırları oluşturmak ([u '[5, 30]' u (30, 70] '], d_type = 'nesne') biz bopens hale:qcut ile <em>yaşlı</em> olarak sayısal <em>yaş</em> pandalar sütununda, ayrıklaştırılabilir itibaren discretized sayısal

>>> bopens = get_open_bounds(df) 
>>> bopens 
# ['(-inf, 5]', '(-inf, 30]', '(-inf, 70]', '(5, +inf)', '(30, +inf)', '(70, +inf)'] 

Sonra emzik içine kategorik değişken dönüştürmek/göstergesi get_dummies değişkenler:

df = pd.get_dummies(df) 
print df 
# age ageD_[5, 30] ageD_(30, 70] 
# 0 5    1    0 
# 1 23    1    0 
# 2 43    0    1 
# 3 70    0    1 
# 4 30    1    0 

Açık sınır sütun veri çerçevesi ile zenginleştirmek istiyoruz, df.shape oldukça büyük, ~ (10e6, 32) olacaktır. Her satır için 6 bopen cols için yapmanın en iyi yolu nedir?

>>> df 
    age age_[5, 30] age_(30, 70] (-inf, 5] (-inf, 30] (-inf, 70] (5, +inf) (30, +inf) (70, +inf) 
0 5   1    0   1   1   1   0   0   0 
1 23   1    0   0   1   1   1   0   0 
2 43   0    1   0   0   1   1   1   0 
3 70   0    1   0   0   1   1   1   0 
4 30   1    0   0   1   1   1   0   0 

PS:

hedef df bu bir benzeyecek

def get_open_bounds(df): 
    bounds = [(int(x[1:]), int(y[:-1])) for x, y in 
      [c.split(', ') for c in df.ageD.cat.categories]] 
    bounds = list(chain(*bounds)) 
    bounds 
    # [5, 30, 30, 70] 

    # to get uniques, keeping the order 
    bounds = [b for idx, b in enumerate(bounds) if b not in bounds[:idx]] 

    # make the open bounds 
    bopens = ["(-inf, {}]".format(b) for b in bounds] + \ 
      ["({}, +inf)".format(b) for b in bounds] 
    return bopens 

cevap

2

IIUC, sen yayın biraz ile yapabilirsiniz: get_open_bounds bopens yapmak için kullanılan:

df['ageD'], bins = pd.qcut(df.iloc[:, 0], 2, retbins=True) 
left = (df["age"].values <= bins[:,None]).T.astype(int) 
dl = pd.DataFrame(left, columns=["(-inf, {}]".format(b) for b in bins]) 
dr = pd.DataFrame(1-left, columns=["({}, +inf)".format(b) for b in bins]) 
dout = pd.concat([pd.get_dummies(df), dl, dr], axis=1) 

bana

verir
>>> dout 
    age ageD_[5, 30] ageD_(30, 70] (-inf, 5] (-inf, 30] (-inf, 70] (5, +inf) (30, +inf) (70, +inf) 
0 5    1    0   1   1   1   0   0   0 
1 23    1    0   0   1   1   1   0   0 
2 43    0    1   0   0   1   1   1   0 
3 70    0    1   0   0   1   1   1   0 
4 30    1    0   0   1   1   1   0   0 

Not # 1: retbins = True ekleyerek ben selelerini kendilerini almak ve bazı garip dize ayrıştırılmasını önleyebilirsiniz.

Not # 2: örtük yaparak "doğru = 1 - sol", hiçbir yaş NaN vardır ve bu nedenle bir varsayarak yaşıyorum> = veya < doğru olmalıdır; emin değilse, bunun yerine right = (df["age"].values > bins[:,None].T.astype(int) yapabileceğini)

Not # 3: Gerçekten çerçeve kurucular yanı df.index geçirerek olmalıdır - senin örneğin doğru olmayabilir kanonik endeksi varken senin. gerçek veriler.

+0

çerçeve yapıcısına df.index geçen ne anlama geliyor? – user3313834

+0

user3313834 @: DataFrame birkaç (o ile doldurulmak üzere biteni) data' 'dahil argümanlar,' columns' (sütun adları) ve 'index' sürer. 'İndeks' iletemedim, bu yüzden 'dl' ve 'dr' endeksleri 0,1,2,3 olsun .. Eğer 'df '0,1,2,3 .. vs yoksa, o zaman endeksler eşleşmeyeceğinden, birleştirme beklenmedik sonuçlar verecektir. – DSM

İlgili konular