Python Pandas使用列名列表索引数据帧

时间:2017-03-03 21:55:01

标签: python pandas indexing dataframe slice

我试图想出一个更好/更清洁的方法来做这样的事情

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

问题在于,对于实际的应用程序,我需要考虑一长列列名,我不想单独输出条件表达式。

2 个答案:

答案 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列表。 (如果总和是最大可能值,那么它只会是真的 - 即,如果所有布尔值都为真。