关于dataframe.query()
的文档是很 terse http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.query.html。我也无法找到网络搜索预测的例子。使用熊猫选择列dataframe.query()
所以我试图简单地提供列名:这给了一个语法错误。同样对于输入select
,然后输入列名称。所以..如何做到这一点?
关于dataframe.query()
的文档是很 terse http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.query.html。我也无法找到网络搜索预测的例子。使用熊猫选择列dataframe.query()
所以我试图简单地提供列名:这给了一个语法错误。同样对于输入select
,然后输入列名称。所以..如何做到这一点?
经过这段时间玩了一会儿,并通过阅读后,我想不出一种方法来做到这一点。
如果不是不可能,显然它至少强烈地不鼓励。当这个问题出现在github上,多产熊猫开发/维护者jreback suggested using df.eval()
for selecting columns and df.query()
for filtering on rows。
UPDATE:
javadba指出的eval
返回值是不是一个数据帧。例如,为了充实jreback的例子多一点...
df.eval('A')
返回熊猫系列,但
df.eval(['A', 'B'])
不会在数据帧返回,返回(熊猫系列)的列表。
因此,最终确保在行和列上过滤灵活性的最佳方式是使用iloc
/loc
,例如,
df.loc[0:4, ['A', 'C']]
输出
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
Dataframe.query
更像是其中超过选择部分 SQL语句条款。
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'])
要选择一列或多列,你可以使用以下命令:
df['A'] or df.loc[:,'A']
或
df[['A','B']] or df.loc[:,['A','B']]
要使用.query
方法,你这样做
df.query('A > B')
这将返回列A中的值大于的所有行n列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
这在我看来更具可读性是布尔与
df[df['A'] > df['B']]
https://pypi.python.org/pypi/pandasql/0.1.0
下面指数的选择是从下面的博客http://blog.yhat.com/posts/pandasql-sql-for-pandas-dataframes.html一个例子。输入是两个DataFrame
s meat
和births
:这种方法给出了从sql预期的projections
,filtering
,aggregation
和sorting
。
@ maxpower确实提到了这个软件包是越野车:所以我们来看看..至少下面显示的博客代码工作正常。
pysqldf = lambda q: sqldf(q, globals())
q = """
SELECT
m.date
, m.beef
, b.births
FROM
meat m
LEFT JOIN
births b
ON m.date = b.date
WHERE
m.date > '1974-12-31';
"""
meat = load_meat()
births = load_births()
df = pysqldf(q)
根据需要,输出是熊猫DataFrame
。
这是对我的具体使用情况下工作的伟大(评估我们的罪行)
odf = pysqldf("select %s from df where sweapons > 10 order by sweapons desc limit 10" %scols)
p('odf\n', odf)
odf
: SMURDER SRAPE SROBBERY SAGASSLT SOTHASLT SVANDLSM SWEAPONS
0 0 0 0 1 1 10 54
1 0 0 0 0 1 0 52
2 0 0 0 0 1 0 46
3 0 0 0 0 1 0 43
4 0 0 0 0 1 0 33
5 1 0 2 16 28 4 32
6 0 0 0 7 17 4 30
7 0 0 0 0 1 0 29
8 0 0 0 7 16 3 29
9 0 0 0 1 0 5 28
更新我做了一堆东西pandasql
现在:计算领域,范围,别名,级联dataframes ..它只是所以生产。
很高兴这对你的情况非常有效。我几次都感到沮丧,但也许这对我没有帮助解决它有所帮助。这是我遇到的最后一个错误 - [从多个表中选择](https://github.com/yhat/pandasql/issues/46)不起作用。这是一种耻辱,因为那种操作在SQL中比在基础熊猫中读得好得多。我也担心,由于这个问题已经公开了大约18个月,并且没有任何人或甚至没有标签,图书馆可能没有得到很好的维护。 –
我觉得这个问题很清楚。 –
@DaniSpringer代码不是每个问题都需要的。 – javadba