带有列名列表的 Python Pandas 索引数据框

Posted

技术标签:

【中文标题】带有列名列表的 Python Pandas 索引数据框【英文标题】:Python Pandas Indexing Dataframe with List of Column Names 【发布时间】:2017-07-24 04:00:23 【问题描述】:

我试图找到一种更好/更清洁的方法来做这样的事情

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

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

【问题讨论】:

【参考方案1】:
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)

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

【讨论】:

【参考方案2】:

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

通过“querymagic”,我指的是做类似的事情

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

【讨论】:

以上是关于带有列名列表的 Python Pandas 索引数据框的主要内容,如果未能解决你的问题,请参考以下文章

循环遍历 pandas 列名以创建列表

Python Pandas:更改格式,其中索引和列名以及相应的值是新的行值

带有自定义列名的Python pandas.DataFrame.to_dict

重命名 Pandas DataFrame 索引

重命名Pandas DataFrame索引

如何从包含Python3中特定索引和列的列表的dict创建Pandas DataFrame?