2017-05-24 5 views
1

Ich habe Steuerdaten, die ich in Pandas importiert habe, und ich möchte bestimmte Segmente der Daten betrachten, damit ich dieses Segment der Bevölkerung analysieren kann. So wie ich das tat, war, um neuen Datenrahmen zu machen wie soWie segmentieren Sie Daten in Pandas sauberer?

new_df = old_tax_df[(old_tax_df.var_1 == 1) & (old_tax_df.var_2 == 1)] 

Gibt es eine Möglichkeit, dies zu tun, ohne Datenrahmen zu machen, dass den Code sauberer machen würde?

+2

Willkommen bei Stack Overflow! Sie können [die Tour] (http://stackoverflow.com/tour) zuerst und lernen [Wie man eine gute Frage stellt] (http://stackoverflow.com/help/how-to-ask) und erstellen Sie eine [ Minimal, vollständig und verifizierbar] (http://stackoverflow.com/help/mcve) Beispiel. Das erleichtert es uns, Ihnen zu helfen. –

Antwort

3

der .query Methode Lassen Sie versuchen, es ist ein bisschen besser lesbar:

new_df = old_tax_df.query('var_1 == 1 and var_2 == 1') 

Oder wie MAXU Punkte in den Kommentaren aus .

new_df = old_tax_df.query("var_1 == var_2 == 1") 

Wird auch funktionieren.

+1

können wir es noch netter machen: 'df.query (" var_1 == var_2 == 1 ")' ;-) – MaxU

+0

Sieht mit der Verwendung von 'query' ziemlich schön aus, nett! – Divakar

+0

Diese Antwort mischt zwei Sprachen. Die Abfragesprache und Python. Dies wird in der Regel als schlechte Praxis und ein Geruch durch saubere Code-Standards angesehen. Die '.query'-Methode kann verwendet werden, um GUI-Eingaben in Code zu leiten, sollte aber nicht im Produktionscode verwendet werden. – firelynx

2

Ein Ansatz -

old_tax_df[(old_tax_df[['var_1','var_2']]==1).all(1)] 

Probelauf -

In [68]: old_tax_df 
Out[68]: 
    var_1 var_2 var_3 var_4 
0  0  1  0  1 
1  1  1  0  2 
2  2  1  1  1 
3  1  0  1  2 
4  1  2  0  2 
5  2  0  1  1 
6  2  0  0  2 
7  0  2  2  0 
8  1  1  0  1 
9  2  1  1  1 

# Original code 
In [69]: old_tax_df[(old_tax_df.var_1 == 1) & (old_tax_df.var_2 == 1)] 
Out[69]: 
    var_1 var_2 var_3 var_4 
1  1  1  0  2 
8  1  1  0  1 

# Proposed code 
In [70]: old_tax_df[(old_tax_df[['var_1','var_2']]==1).all(1)] 
Out[70]: 
    var_1 var_2 var_3 var_4 
1  1  1  0  2 
8  1  1  0  1 

# Alternative using `.eq` to replace `==1` 
In [76]: old_tax_df[old_tax_df[['var_1','var_2']].eq(1).all(1)] 
Out[76]: 
    var_1 var_2 var_3 var_4 
1  1  1  0  2 
8  1  1  0  1 
0

Mit .groupby

Sie könnten die groupby Methode verwenden, dann die Gruppen zugreifen.

groups = df.groupby(['var_1', 'var_2', 'var_3', 'var_4']) 
groups.get_group((2, 0, 0, 2)) 

Dies ist eine Möglichkeit, einen Datenrahmen in mehrere Datenrahmen basierend auf Werten zu segmentieren.

Mit .loc

df.set_index(['var_1', 'var_2', 'var_3', 'var_4'], inplace=True) 
df.loc[2, 0, 0, 2] 

Wird das gleiche Ergebnis liefern, mit der Ausnahme, dass der Datenrahmen wird nun auf den variablen Feldern indiziert werden.

Mehr zu diesem Thema finden Sie in der Dokumentations-Seite Indexing and Selecting Data für Pandas.

Verwandte Themen