2017-06-18 189 views
1

关于dataframe.query()的文档是 terse http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.query.html。我也无法找到网络搜索预测的例子。使用熊猫选择列dataframe.query()

所以我试图简单地提供列名:这给了一个语法错误。同样对于输入select,然后输入列名称。所以..如何做到这一点?

+0

我觉得这个问题很清楚。 –

+0

@DaniSpringer代码不是每个问题都需要的。 – javadba

回答

2

经过这段时间玩了一会儿,并通过阅读后,我想不出一种方法来做到这一点。

如果不是不可能,显然它至少强烈地不鼓励。当这个问题出现在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 
+0

但'eval'不返回DataFrame ..'ret:ndarray,标量或pandas对象'。在任何情况下都为此付出努力。 – javadba

+0

hm好点。只是尝试过'iris2 = iris.eval(['sepal_length','species'])',但我回来的iris2是一个'list' ...,每个元素都是一个'Pandas Series'。奇怪的。 –

+0

看起来我们回到了'iloc/loc'。也许可以玩一下,我可以在这里奖励。 – javadba

2

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']] 
1

pandasql

https://pypi.python.org/pypi/pandasql/0.1.0

下面指数的选择是从下面的博客http://blog.yhat.com/posts/pandasql-sql-for-pandas-dataframes.html一个例子。输入是两个DataFrame s meatbirths:这种方法给出了从sql预期的projections,filtering,aggregationsorting

@ 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 ..它只是所以生产。

+0

很高兴这对你的情况非常有效。我几次都感到沮丧,但也许这对我没有帮助解决它有所帮助。这是我遇到的最后一个错误 - [从多个表中选择](https://github.com/yhat/pandasql/issues/46)不起作用。这是一种耻辱,因为那种操作在SQL中比在基础熊猫中读得好得多。我也担心,由于这个问题已经公开了大约18个月,并且没有任何人或甚至没有标签,图书馆可能没有得到很好的维护。 –