2017-03-03 140 views
2

我試圖找出一個更好/更清潔的方式做這樣的事情Python的大熊貓索引數據框列名的名單

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)] 

我想這一點,但沒有奏效。

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] 

誰能告訴我

1)如何讓我的方法的工作

2)如果存在的話,一個完全不同的方法,可能是更好的

3)怎麼辦有點像這樣複雜一點:

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)] 

問題是對於實際的應用程序,我需要考慮一長串列名稱,我不想單獨輸入條件表達式。

回答

3

您可以簡單地使用all,同時把你列的子集在布爾指數。

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

對於你的問題的第二部分,假設你想使用實際的熊貓語法,而不是一些query魔法我認爲你的方法看起來不錯。

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

通過「query魔法」,我會指做這樣

>>> 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 

一些東西,我會親自避免,除非我有很好的理由這樣做。

演示

>>> 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)] 

將爲您提供每列的布爾值列表。 (根據需要切片df.columns,或使一個單獨的列表

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

會給你,你可以用它來尋找目標行的bool的列表。(如果和最大可能的 - 即它只會是真實的是,如果所有的布爾值是真實的。