2017-06-23 4 views
2

Ich bin verwirrt, warum der untenstehende Code nicht funktioniert. Ich habe die Spalte AgeBands mit der pd.cut Funktion erstellt, also ist der Typ Kategorie. In der Theorie sollte ich in der Lage sein, mich darauf zu subsettieren, wie ich es in einer String-Spalte tun würde, aber wenn ich versuche, dass der resultierende Datenrahmen new_df null Zeilen hat. Was vermisse ich?Subset Datenrahmen auf einer Spalte mit Typ = Kategorie

import numpy as np 
import pandas as pd 

df = pd.DataFrame({'Age' : [22, 38, 26, 35, 35, 65]}) 
df['AgeBands'] = pd.cut(df['Age'], [0,10,20,30,40,50,max(df['Age'])]) 

new_df = df[df['AgeBands'] == '(30-40]'] 
new_df.shape 

Wenn df.info() läuft Ich habe Bestätigung der AgeBands tatsächlich vom Typ der Kategorie:

<class 'pandas.core.frame.DataFrame'> 
RangeIndex: 6 entries, 0 to 5 
Data columns (total 2 columns): 
Age   6 non-null int64 
AgeBands 6 non-null category 
dtypes: category(1), int64(1) 
memory usage: 174.0 bytes 
+0

Is '(30-40]' eine Regex – Tbaki

+0

@Tbaki - nein, (30-40] der Wert AgeBands hat von pd.cut.Es ist eine Zeichenfolge, aber vielleicht Python sieht es als Regex? Ich werde es untersuchen – BogdanC

Antwort

2

Sie falsch schreiben, was Sie in der df hatte, es ist '(30, 40]', nicht '(30-40]'

import numpy as np 
import pandas as pd 

df = pd.DataFrame({'Age' : [22, 38, 26, 35, 35, 65]}) 
df['AgeBands'] = pd.cut(df['Age'], [0,10,20,30,40,50,max(df['Age'])]) 

new_df = df[df['AgeBands'] == '(30, 40]'] 
new_df 

ouput

Age AgeBands 
1 38 (30, 40] 
3 35 (30, 40] 
4 35 (30, 40] 
+0

@Tbaki - das war es. Dies ist peinlich, vielen Dank für Ihren schnellen Fund. – BogdanC

+0

@BogdanC Kein Problem, happ zu den Besten von uns, einen schönen Tag. : D – Tbaki

+0

@BogdanC Das ist nicht peinlich. Ich dachte, das war das Problem, sobald ich deinen Code sah. Aber während ich überprüft habe, habe ich vergessen, einen Ausdruck (Datenrahmen) hinzuzufügen, so dass ich nur die vorherige Ausgabe im Interpreter sah (eine mit leerem Datenrahmen) und dachte, wow, das ist komplexer. Liest die Dokumente, Artikel. Es tut mehr weh als Verlegenheit. – void

1

Zum besseren Verständnis können Sie Label für Bucket-Bereich festlegen.

df['AgeBands'] = pd.cut(df['Age'], [0,10,20,30,40,50,max(df['Age'])], labels=range(1,7)) 

Ausgang:

Age AgeBands 
0 22  3 
1 38  4 
2 26  3 
3 35  4 
4 35  4 
5 65  6 

finden df[df['AgeBands'] == 3]

Age AgeBands 
0 22  3 
2 26  3 
Verwandte Themen