關於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