Python 什么';关键字';列';在查询方法中?

Python 什么';关键字';列';在查询方法中?,python,pandas,Python,Pandas,我刚刚发现在查询方法中解析了关键字列,但正确的使用方法是什么?我没有在报告中找到解释 DataFrame.query相当于第一次调用DataFrame.eval,然后使用求值结果对原始数据帧进行索引 In [9]: idx = df.eval('columns >= 1') In [10]: idx Out[10]: 0 False 1 True 2 True dtype: bool In [11]: df.loc[idx] Out[11]: 0 1 2

我刚刚发现在查询方法中解析了关键字
,但正确的使用方法是什么?我没有在报告中找到解释


DataFrame.query
相当于第一次调用
DataFrame.eval
,然后使用求值结果对原始数据帧进行索引

In [9]: idx = df.eval('columns >= 1')

In [10]: idx
Out[10]:
0    False
1     True
2     True
dtype: bool

In [11]: df.loc[idx]
Out[11]:
   0  1  2
1  3  4  5
In [13]: idx2 = df2.eval('columns >= 1')

In [14]: idx2
Out[14]:
a    True
b    True
c    True
dtype: bool
这里的
'columns'
相当于
df.columns
eval
的结果是一个序列,其索引是
df.columns
,因此在命名列时,
eval
的结果不能用作原始数据帧的索引

In [9]: idx = df.eval('columns >= 1')

In [10]: idx
Out[10]:
0    False
1     True
2     True
dtype: bool

In [11]: df.loc[idx]
Out[11]:
   0  1  2
1  3  4  5
In [13]: idx2 = df2.eval('columns >= 1')

In [14]: idx2
Out[14]:
a    True
b    True
c    True
dtype: bool
实际上,像这样在
查询
表达式中使用
'columns'
是不好的。在第一个示例中,恰好返回的序列可以用作索引,但它可能不适用于一般情况

例如,数据框形状的简单更改将导致错误

In [15]: df3 = pd.DataFrame(np.arange(6).reshape(3,2))

In [16]: df3.query('columns >= 1')
---------------------------------------------------------------------------
IndexingError                             Traceback (most recent call last)
<ipython-input-26-75248672c992> in <module>()
      1 df = pd.DataFrame(np.arange(6).reshape(3,2))
----> 2 df.query('columns >= 1')

/home/ubuntu/anaconda/lib/python2.7/site-packages/pandas/core/frame.pyc in query(self, expr, **kwargs)
   1936 
   1937         try:
-> 1938             return self.loc[res]
   1939         except ValueError:
   1940             # when res is multi-dimensional loc raises, but this is sometimes a

/home/ubuntu/anaconda/lib/python2.7/site-packages/pandas/core/indexing.pyc in __getitem__(self, key)
   1187             return self._getitem_tuple(key)
   1188         else:
-> 1189             return self._getitem_axis(key, axis=0)
   1190 
   1191     def _getitem_axis(self, key, axis=0):

/home/ubuntu/anaconda/lib/python2.7/site-packages/pandas/core/indexing.pyc in _getitem_axis(self, key, axis)
   1304             return self._get_slice_axis(key, axis=axis)
   1305         elif is_bool_indexer(key):
-> 1306             return self._getbool_axis(key, axis=axis)
   1307         elif is_list_like_indexer(key):
   1308 

/home/ubuntu/anaconda/lib/python2.7/site-packages/pandas/core/indexing.pyc in _getbool_axis(self, key, axis)
   1194     def _getbool_axis(self, key, axis=0):
   1195         labels = self.obj._get_axis(axis)
-> 1196         key = check_bool_indexer(labels, key)
   1197         inds, = key.nonzero()
   1198         try:

/home/ubuntu/anaconda/lib/python2.7/site-packages/pandas/core/indexing.pyc in check_bool_indexer(ax, key)
   1657         mask = com.isnull(result.values)
   1658         if mask.any():
-> 1659             raise IndexingError('Unalignable boolean Series key provided')
   1660 
   1661         result = result.astype(bool).values

IndexingError: Unalignable boolean Series key provided
[15]中的
df3=pd.DataFrame(np.arange(6).重塑(3,2))
在[16]中:df3.query('columns>=1')
---------------------------------------------------------------------------
IndexingError回溯(最近一次调用上次)
在()
1 df=pd.数据帧(np.arange(6).重塑(3,2))
---->2 df.query('columns>=1')
/查询中的home/ubuntu/anaconda/lib/python2.7/site-packages/pandas/core/frame.pyc(self,expr,**kwargs)
1936
1937尝试:
->1938返回自我位置[res]
1939除值错误外:
1940年#当res是多维时,loc升高,但有时这是一个
/home/ubuntu/anaconda/lib/python2.7/site-packages/pandas/core/index.pyc in____getitem____(self,key)
1187返回self.\u getitem\u元组(键)
1188其他:
->1189返回自我。\u获取项目\u轴(键,轴=0)
1190
1191定义获取项目轴(自身、键、轴=0):
/home/ubuntu/anaconda/lib/python2.7/site-packages/pandas/core/index.pyc in_getitem_axis(self、key、axis)
1304返回自我。获取切片轴(键,轴=轴)
1305 elif is_bool_索引器(键):
->1306返回自身轴(键,轴=轴)
1307 elif是类似列表的索引器(键):
1308
/home/ubuntu/anaconda/lib/python2.7/site-packages/pandas/core/index.pyc in_getbool_axis(self,key,axis)
1194 def_getbool_轴(自、键、轴=0):
1195标签=self.obj.\u get\u轴(轴)
->1196键=检查布尔索引器(标签,键)
1197 inds,=key.nonzero()
1198尝试:
/home/ubuntu/anaconda/lib/python2.7/site-packages/pandas/core/index.pyc in check\u bool\u indexer(ax,key)
1657 mask=com.isnull(result.values)
1658如果掩码为.any():
->1659 raise IndexingError('提供了不可对齐的布尔系列键')
1660
1661 result=result.astype(bool).values
IndexingError:提供了不可对齐的布尔系列键
标准语法(带命名列)类似于
df2.query('a>1')