2017-03-03 7 views
2

besser ist als ich/sauberer Weg, um versuche, so etwas wie diesePython Pandas Indizierung Datenrahmen mit Liste der Spaltennamen

single_val = 0.5 
df = pd.DataFrame(np.random.rand(10, 7), columns=list(a,b,c,d,e,f,g)) 
df[(df['a']>single_val) & (df['c']>single_val) & (df['f']>single_val)] 

ich versuchte, dies zu tun, aber es hat nicht funktioniert.

single_val = 0.5 
df = pd.DataFrame(np.random.rand(10, 7), columns=(a,b,c,d,e,f,g)) 
data_cols = ['a','c','f'] 
df[df[data_cols]>single_val] 

Kann mir jemand sagen

1), wie mein Ansatz Arbeit

2) zu machen, wenn es einen völlig anderen Ansatz besteht, die besser sein könnte

3), wie zu tun etwas ein wenig komplexer wie folgt aus:

val_1 = 0.5 
val_2 = 0.7 
val_3 = 0.9 
df = pd.DataFrame(np.random.rand(10, 7), columns=list(a,b,c,d,e,f,g)) 
df[(df['a']>val_1) & (df['c']<=val_2) & (df['f']<val_3)] 

Das Problem ist, Für die eigentliche Anwendung muss ich eine lange Liste von Spaltennamen berücksichtigen und ich möchte keine bedingten Ausdrücke einzeln eingeben.

Antwort

3

Sie einfach all während der Einnahme eine teil~~POS=TRUNC der Spalten in der boolean Index verwenden können.

df[(df[['a', 'c', 'f']] > single_val).all(1)] 

Für den zweiten Teil Ihrer Frage, vorausgesetzt, Sie wollen Verwenden Sie die tatsächliche Pandas-Syntax und nicht einige query magisch Ich denke, dein Ansatz sieht gut aus.

df[(df.a > val_1) & (df.c <= val_2) & (df.f < val_3)] 

Mit „query Magie“, würde ich etwas zu tun, wie

>>> conditions = [('a', '>', '1'), ('c', '<=', '2'), ('f', '<', '3')] 
>>> query_s = ' & '.join('({0} {1} @val_{2})'.format(*ops) for ops in conditions) 
>>> df.query(query_s) 

      a   b   c   d   e   f   g 
1 0.838162 0.695019 0.564764 0.510963 0.556313 0.800921 0.698653 

die ich persönlich würde vermeiden, es sei denn ich hatte wirklich guten Grund, dies zu tun, mit Bezug.

Demo

>>> df 

      a   b   c   d   e   f   g 
0 0.328940 0.411345 0.369318 0.388301 0.213110 0.951961 0.623183 
1 0.838162 0.695019 0.564764 0.510963 0.556313 0.800921 0.698653 
2 0.507048 0.729398 0.814790 0.968008 0.803806 0.355858 0.987389 
3 0.402825 0.615113 0.965653 0.223877 0.537247 0.935251 0.402023 
4 0.133080 0.641351 0.539981 0.704075 0.539326 0.778625 0.161530 
5 0.916859 0.977980 0.954934 0.146030 0.003589 0.889590 0.071854 
6 0.655720 0.836904 0.881695 0.423626 0.5 0.472120 0.646313 
7 0.925715 0.522039 0.107891 0.513302 0.688067 0.909862 0.161232 
8 0.444260 0.345057 0.872849 0.859115 0.552067 0.173852 0.826250 
9 0.301961 0.090283 0.143682 0.765601 0.398364 0.589366 0.177203 

>>> df[(df[['a', 'c', 'f']] > single_val).all(1)] 

      a   b   c   d   e   f   g 
1 0.838162 0.695019 0.564764 0.510963 0.556313 0.800921 0.698653 
5 0.916859 0.977980 0.954934 0.146030 0.003589 0.889590 0.071854 

>>> df[(df.a > val_1) & (df.c <= val_2) & (df.f < val_3)] 

      a   b   c   d   e   f   g 
1 0.838162 0.695019 0.564764 0.510963 0.556313 0.800921 0.698653 
0
ls = [df[col] > val for col, val in zip(df.columns, list_of_vals)] 

wird Ihnen eine Liste der booleschen Werte für jede Spalte geben. (Scheibe df.columns nach Bedarf, oder machen Sie eine separate Liste

np.sum(ls, axis=0) == len(list_of_vals) 

finden Sie eine Liste von bools geben, die Sie verwenden können Zielzeilen zu finden. (Es nur wahr sein werden, wenn die Summe der maximal mögliche -Das ist alle ist, wenn die boolesche Werte sind wahr.

Verwandte Themen