我试图想出一个更好/更清洁的方法来做这样的事情
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)]
问题在于,对于实际的应用程序,我需要考虑一长列列名,我不想单独输出条件表达式。
答案 0 :(得分:3)
您可以在布尔索引中获取列的子集时使用all
。
df[(df[['a', 'c', 'f']] > single_val).all(1)]
对于你问题的第二部分,假设你想要使用实际的Pandas语法而不是某些query
魔法,我认为你的方法看起来很好。
df[(df.a > val_1) & (df.c <= val_2) & (df.f < val_3)]
通过&#34; query
魔法&#34;,我指的是做类似的事情
>>> 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.732105 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
答案 1 :(得分: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列表。 (如果总和是最大可能值,那么它只会是真的 - 即,如果所有布尔值都为真。