使用pandas dataframe.query()选择列

时间:2017-06-18 00:48:01

标签: python sql pandas dataframe

dataframe.query()上的文档非常简洁http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.query.html。我也无法通过网络搜索找到投影的例子。

所以我尝试简单地提供列名:这给出了语法错误。同样,键入select,然后键入列名称。那么..怎么做?

5 个答案:

答案 0 :(得分:3)

在玩了一段时间并阅读DataFrame.query eval之后,我无法找到方法。

如果不是不可能的话,显然它至少是强烈劝阻的。当这个问题出现在github上时,多产的Pandas dev / maintainer jreback the source code

更新:

javadba指出df.eval('A') 的返回值不是数据帧。例如,为了充实jreback的例子......

df.eval(['A', 'B'])

返回Pandas系列,但

iloc

没有在DataFrame返回,它返回一个列表(Pandas系列)。

因此,最终保持过滤行和列的灵活性的最佳方法是使用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

输出

public ProjectContext() : base(new JetConnection(@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source='C:\Test-Project.sep'; providerName=JetEntityFrameworkProvider; Password=SEEME;"), true)
{

}

答案 1 :(得分:3)

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']) 更像是SQL语句中的 where子句,而不是 select part

df['A'] or df.loc[:,'A']

要选择一列或多列,您可以使用以下内容:

df[['A','B']] or df.loc[:,['A','B']]

.query

要使用df.query('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 将返回A列中的值大于b列中值的所有行。

df[df['A'] > df['B']]

在我看来,使用

选择布尔索引更具可读性
def t():
   global i
   # next code

答案 2 :(得分:2)

pandasql

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

以下是来自以下博客http://blog.yhat.com/posts/pandasql-sql-for-pandas-dataframes.html的示例。输入为两个DataFrame s meatbirths:此方法提供projectionsfilteringaggregationsorting期待来自sql。

@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做了很多事情:计算字段,限制,别名,级联数据帧......它只是所以生产力。

答案 3 :(得分:2)

怎么样

df_new = df.query('col1==1 & col2=="x" ')[['col1', 'col3']]

将对col1等于1且col2等于“ X”的行进行过滤,并仅返回第1列和第3列。

,但您需要过滤行,否则行不通。

对于过滤列,最好只使用.loc.iloc

答案 4 :(得分:1)

只是一个更简单的示例解决方案(使用 math.):

我的目标:

我希望查询结果中包含 latlon 列。

我的表详细信息:

get
<块引用>

Index(['name', 'city_id', 'lat', 'lon', 'CountryName', 'ContinentName'], dtype='object')

df_city.columns
<块引用>
# All columns
city_continent = df_city.get(df_city['ContinentName']=='Oceania')

# Only lat and lon
city_continent[['lat', 'lon']]