2017-07-25 7 views
3

Ich habe einen Pandas-Datenrahmen erstellt und möchte die Daten basierend auf einer bestimmten booleschen Logik filtern. Im Wesentlichen möchte ich eher die Index-Match-Funktion als die einfache Filterung übertreffen. Ich habe viele andere Themen recherchiert.Datenrahmen Boolean Logic Index Match

  1. Wenn ich meinen Filter anwende, gibt der Datenrahmen Null wahre Werte zurück. Warum werden 0 wahre Werte zurückgegeben, wenn ich mit meiner Logik flexibel war? und;

  2. Wenn ich eine fünfte Säule eingeführt, sagen Spalte 'D', mit random.randomint(100-1000,100), welche Logik würde ich verwenden, um bedingt die Maximalwerte nur für Spalte D zu finden? I.e. Kann ich erzwingen, dass ein Datenrahmen nur dann die höchsten wahren Werte aus einer bestimmten Spalte zurückgibt, wenn mehrere echte Werte zurückgegeben werden?

Beratung sehr geschätzt. Vielen Dank im Voraus.

import pandas as pd 

df = pd.DataFrame({ 
    'Step': [1,1,1,1,1,1,2,2,2,2,2,2], 
    'A': [4,5,6,7,4,5,6,7,4,5,6,7], 
    'B': [10,20,30,40,10,20,30,40,10,20,30,40], 
    'C': [0,0.5,1,1.5,2,2.5,0,0.5,1,1.5,2.0,2.5] 
}) 

columns = ['Step','A','B','C'] 

df=df[columns] 

new_df=df[(df.Step == 1) & (df.A == 4|5|6|7) & (df.B == 10|20|30|40)] 
new_df 
+1

Können Sie ein Beispiel für '2.' hinzufügen? Brauchen Sie einen größten Wert? – jezrael

Antwort

4

Sie können boolean indexing mit isin verwenden:

new_df=df[(df.Step == 1) & (df.A.isin([4,5,6,7])) & (df.B.isin([10,20,30,40]))] 

Es für die zweite Frage scheint DataFrame.nlargest brauchen:

np.random.seed(789) 
df = pd.DataFrame({ 
    'Step': [1,1,1,1,1,1,2,2,2,2,2,2], 
    'A': [4,5,6,7,4,5,6,7,4,5,6,7], 
    'B': [10,20,30,40,10,20,30,40,10,20,30,40], 
    'C': [0,0.5,1,1.5,2,2.5,0,0.5,1,1.5,2.0,2.5], 
    'D':np.random.choice(np.arange(100,1000,100), size=12) 
}) 
print (df) 
    A B C D Step 
0 4 10 0.0 400  1 
1 5 20 0.5 300  1 
2 6 30 1.0 200  1 
3 7 40 1.5 400  1 
4 4 10 2.0 500  1 
5 5 20 2.5 900  1 
6 6 30 0.0 500  2 
7 7 40 0.5 200  2 
8 4 10 1.0 900  2 
9 5 20 1.5 100  2 
10 6 30 2.0 200  2 
11 7 40 2.5 200  2 

new_df= df[(df.Step == 1)&(df.A.isin([4,5,6,7]))&(df.B.isin([10,20,30,40]))].nlargest(1,'D') 
print (new_df) 
    A B C D Step 
5 5 20 2.5 900  1 
4

Mit DataFrame.query() Methode:

In [7]: new_df = df.query("Step==1 and A in [4,5,6,7] and B in [10,20,30,40]") 

In [8]: new_df 
Out[8]: 
    Step A B C 
0  1 4 10 0.0 
1  1 5 20 0.5 
2  1 6 30 1.0 
3  1 7 40 1.5 
4  1 4 10 2.0 
5  1 5 20 2.5