Python Pandas 使用列名列表索引 Dataframe

Python Pandas Indexing Dataframe with List of Column Names

我试图想出一个 better/cleaner 方法来做这样的事情

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

问题是在实际应用中,我需要考虑一长串列名,我不想单独输入条件表达式。

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)

将为您提供可用于查找目标行的布尔值列表。 (只有当总和是可能的最大值时它才会为真——也就是说,如果所有布尔值都为真。

您可以简单地使用 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)]

通过“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.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