使用 pandas dataframe.query() 选择列

jav*_*dba 9 python sql dataframe pandas

在该文档dataframe.query()非常简洁http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.query.html。我也无法通过网络搜索找到预测的例子。

所以我试着简单地提供列名:这给出了一个语法错误。同样用于键入select然后键入列名。那么..如何做到这一点?

Max*_*wer 7

玩弄了一会儿,并通过阅读后的源代码DataFrame.query,我不能想出一个办法做到这一点。

如果这不是不可能,显然至少是强烈不鼓励的。当这个问题出现在 github 上时,多产的 Pandas dev/maintainer jreback建议使用df.eval()fordf.query() selection columns 和filter on rows


更新:

javadba 指出 的返回值eval不是数据帧。例如,更多地充实 jreback 的例子......

df.eval('A')
Run Code Online (Sandbox Code Playgroud)

返回一个 Pandas 系列,但是

df.eval(['A', 'B'])
Run Code Online (Sandbox Code Playgroud)

不返回 DataFrame,它返回一个列表(Pandas 系列)。

因此,似乎最终保持对行和列进行过滤的灵活性的最佳方法是使用iloc/ loc,例如

df.loc[0:4, ['A', 'C']]
Run Code Online (Sandbox Code Playgroud)

输出

          A         C
0 -0.497163 -0.046484
1  1.331614  0.741711
2  1.046903 -2.511548
3  0.314644 -0.526187
4 -0.061883 -0.615978
Run Code Online (Sandbox Code Playgroud)


Sco*_*ton 5

Dataframe.query与select 部分相比,它更像是SQL 语句中的where 子句

import pandas as pd
import numpy as np
np.random.seed(123)
dates = pd.date_range('1/1/2000', periods=8)
df = pd.DataFrame(np.random.randn(8, 4), index=dates, columns=['A', 'B', 'C', 'D'])
Run Code Online (Sandbox Code Playgroud)

要选择一列或多列,您可以使用以下命令:

df['A'] or df.loc[:,'A']
Run Code Online (Sandbox Code Playgroud)

或者

df[['A','B']] or df.loc[:,['A','B']]
Run Code Online (Sandbox Code Playgroud)

要使用该.query方法,您可以执行类似的操作

df.query('A > B')这将返回 A 列中的值大于 b 列中的值的所有行。

                   A         B         C         D
2000-01-03  1.265936 -0.866740 -0.678886 -0.094709
2000-01-04  1.491390 -0.638902 -0.443982 -0.434351
2000-01-05  2.205930  2.186786  1.004054  0.386186
2000-01-08 -0.140069 -0.861755 -0.255619 -2.798589
Run Code Online (Sandbox Code Playgroud)

我认为布尔索引选择更具可读性

df[df['A'] > df['B']]
Run Code Online (Sandbox Code Playgroud)