2017-06-18 196 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個月,並且沒有任何人或甚至沒有標籤,圖書館可能沒有得到很好的維護。 –