带有列名列表的 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)]
通过“query
magic”,我指的是做类似的事情
>>> 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 索引数据框的主要内容,如果未能解决你的问题,请参考以下文章
Python Pandas:更改格式,其中索引和列名以及相应的值是新的行值