jav*_*dba 9 python sql dataframe pandas
在该文档dataframe.query()是非常简洁http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.query.html。我也无法通过网络搜索找到预测的例子。
所以我试着简单地提供列名:这给出了一个语法错误。同样用于键入select然后键入列名。那么..如何做到这一点?
玩弄了一会儿,并通过阅读后的源代码的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)
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)