2017-04-15 9 views
1

Also habe ich zwei Sätze von Features, die ich bin (klassifizieren) und dann kombinieren, um ein neues Feature zu erstellen. Es ist nicht unähnlich, Koordinaten in Gitter auf einer Karte zu klassifizieren.2-dimensionale Binning mit Pandas

Das Problem ist, dass die Features nicht gleichmäßig verteilt sind, und ich möchte Quantils beim Binning (wie mit pandas.qcut()) auf beiden Features/Koordinaten verwenden.

Gibt es einen besseren Weg als auf beiden Funktionen zu tun und dann die Ergebnisbeschriftungen verketten?

+0

Ich kann nicht an irgendwelche denken. Es scheint der absolut geeignete Weg dafür zu sein. Besser wäre es nur, eine eingebaute Funktion dafür zu haben. – piRSquared

+0

Ich liege falsch ... es gibt etwas, das ich gerne besser hätte – piRSquared

+0

Ich warte ernsthaft ... –

Antwort

1

Erstellen Sie ein kartesisches Produkt kategorisch.

Betrachten Sie den Datenrahmen df

df = pd.DataFrame(dict(A=np.random.rand(20), B=np.random.rand(20))) 

      A   B 
0 0.538186 0.038985 
1 0.185523 0.438329 
2 0.652151 0.067359 
3 0.746060 0.774688 
4 0.373741 0.009526 
5 0.603536 0.149733 
6 0.775801 0.585309 
7 0.091238 0.811828 
8 0.504035 0.639003 
9 0.671320 0.132974 
10 0.619939 0.883372 
11 0.301644 0.882258 
12 0.956463 0.391942 
13 0.702457 0.099619 
14 0.367810 0.071612 
15 0.454935 0.651631 
16 0.882029 0.015642 
17 0.880251 0.348386 
18 0.496250 0.606346 
19 0.805688 0.401578 

Wir können neue categoricals erstellen mit pd.qcut

d1 = df.assign(
    A_cut=pd.qcut(df.A, 2, labels=[1, 2]), 
    B_cut=pd.qcut(df.B, 2, labels=list('ab')) 
) 

      A   B A_cut B_cut 
0 0.538186 0.038985  1  a 
1 0.185523 0.438329  1  b 
2 0.652151 0.067359  2  a 
3 0.746060 0.774688  2  b 
4 0.373741 0.009526  1  a 
5 0.603536 0.149733  1  a 
6 0.775801 0.585309  2  b 
7 0.091238 0.811828  1  b 
8 0.504035 0.639003  1  b 
9 0.671320 0.132974  2  a 
10 0.619939 0.883372  2  b 
11 0.301644 0.882258  1  b 
12 0.956463 0.391942  2  a 
13 0.702457 0.099619  2  a 
14 0.367810 0.071612  1  a 
15 0.454935 0.651631  1  b 
16 0.882029 0.015642  2  a 
17 0.880251 0.348386  2  a 
18 0.496250 0.606346  1  b 
19 0.805688 0.401578  2  b 

Sie können das kartesische Produkt kategorisch mit Tupeln erstellen

d2 = d1.assign(cartesian=pd.Categorical(d1.filter(regex='_cut').apply(tuple, 1))) 
print(d2) 

      A   B A_cut B_cut cartesian 
0 0.538186 0.038985  1  a (1, a) 
1 0.185523 0.438329  1  b (1, b) 
2 0.652151 0.067359  2  a (2, a) 
3 0.746060 0.774688  2  b (2, b) 
4 0.373741 0.009526  1  a (1, a) 
5 0.603536 0.149733  1  a (1, a) 
6 0.775801 0.585309  2  b (2, b) 
7 0.091238 0.811828  1  b (1, b) 
8 0.504035 0.639003  1  b (1, b) 
9 0.671320 0.132974  2  a (2, a) 
10 0.619939 0.883372  2  b (2, b) 
11 0.301644 0.882258  1  b (1, b) 
12 0.956463 0.391942  2  a (2, a) 
13 0.702457 0.099619  2  a (2, a) 
14 0.367810 0.071612  1  a (1, a) 
15 0.454935 0.651631  1  b (1, b) 
16 0.882029 0.015642  2  a (2, a) 
17 0.880251 0.348386  2  a (2, a) 
18 0.496250 0.606346  1  b (1, b) 
19 0.805688 0.401578  2  b (2, b) 

Wenn Sie so geneigt waren, könnten Sie sogar eine Bestellung für sie erklären.

+0

Sieht gut aus. Vielen Dank! Wird diese Antwort innerhalb eines angemessenen Zeitraums akzeptieren, wenn keine anderen Herausforderer erscheinen. –

+0

@RubenL. Bitte – piRSquared