Python 使用布尔索引的索引错误

Python 使用布尔索引的索引错误,python,pandas,Python,Pandas,我正在尝试使用类似于的布尔序列对数据帧进行索引 上面的工作原理与预期的一样,但是当我尝试使用原始数据帧而不重置索引时,我得到以下错误 In [6]: pairs[mask] C:\Anaconda\lib\site-packages\pandas\core\frame.py:1808: UserWarning: Boolean Series key will be reindexed to match DataFrame index. "DataFrame index.", UserWarn

我正在尝试使用类似于的布尔序列对数据帧进行索引

上面的工作原理与预期的一样,但是当我尝试使用原始数据帧而不重置索引时,我得到以下错误

In [6]: pairs[mask]
C:\Anaconda\lib\site-packages\pandas\core\frame.py:1808: UserWarning: Boolean Series key will be reindexed to match DataFrame index.
  "DataFrame index.", UserWarning)
---------------------------------------------------------------------------
IndexingError                             Traceback (most recent call last)
<ipython-input-6-9eca5ffbdaf7> in <module>()
----> 1 pairs[mask]

C:\Anaconda\lib\site-packages\pandas\core\frame.pyc in __getitem__(self, key)
   1772         if isinstance(key, (Series, np.ndarray, Index, list)):
   1773             # either boolean or fancy integer index
-> 1774             return self._getitem_array(key)
   1775         elif isinstance(key, DataFrame):
   1776             return self._getitem_frame(key)

C:\Anaconda\lib\site-packages\pandas\core\frame.pyc in _getitem_array(self, key)
   1812             # _check_bool_indexer will throw exception if Series key cannot
   1813             # be reindexed to match DataFrame rows
-> 1814             key = _check_bool_indexer(self.index, key)
   1815             indexer = key.nonzero()[0]
   1816             return self.take(indexer, axis=0, convert=False)

C:\Anaconda\lib\site-packages\pandas\core\indexing.pyc in _check_bool_indexer(ax, key)
   1637         mask = com.isnull(result.values)
   1638         if mask.any():
-> 1639             raise IndexingError('Unalignable boolean Series key provided')
   1640 
   1641         result = result.astype(bool).values

IndexingError: Unalignable boolean Series key provided

我想我会放下评论中提到的解决方案@EdChum。他指出的问题是mask.index与pairs.index不一致。用成对的索引替换掩码的索引,我们得到了预期的行为

In[10]: mask.index = pairs.index.copy()
In[11]: pairs[mask]
Out[11]: 
               count  mean
Currency Pair             
USD.CAD            1   3.6
EUR.USD            8   3.6
GBP.USD            2   2.7

我想我会放下评论中提到的解决方案@EdChum。他指出的问题是mask.index与pairs.index不一致。用成对的索引替换掩码的索引,我们得到了预期的行为

In[10]: mask.index = pairs.index.copy()
In[11]: pairs[mask]
Out[11]: 
               count  mean
Currency Pair             
USD.CAD            1   3.6
EUR.USD            8   3.6
GBP.USD            2   2.7

您可以直接使用从索引生成的掩码

In [22]: mask = pairs.index.str.contains("USD")
In [23]: pairs[mask]
Out[23]: 
               count  mean
Currency Pair             
USD.CAD            1   3.6
EUR.USD            8   3.6
GBP.USD            2   2.7

无需重新编制任何索引。

您可以直接使用从索引生成的掩码

In [22]: mask = pairs.index.str.contains("USD")
In [23]: pairs[mask]
Out[23]: 
               count  mean
Currency Pair             
USD.CAD            1   3.6
EUR.USD            8   3.6
GBP.USD            2   2.7

无需重新编制任何索引。

我认为您在这里有点困惑,您需要重置索引的原因是,如果不重置索引,则将没有任何内容可与掩码索引值匹配,因为对df使用您的currency.pair字符串作为索引值。在这种情况下,长度不是问题所在,而是索引值无法与掩码索引对齐。我不是熊猫专家,但它不是简单地来自原始对,而不是具有不同于对的索引。重置索引?pairs的索引有一个dtype=object,而mask有一个type=Int64。我认为您在这里有点困惑,您需要重置索引的原因是,如果您没有重置索引,那么将没有任何东西可以匹配mask索引值,因为pairs df使用您的currency.pair字符串作为索引值。在这种情况下,长度不是问题所在,而是索引值无法与掩码索引对齐。我不是熊猫专家,但它不是简单地来自原始对,而不是具有不同于对的索引。重置索引?pairs的索引有一个dtype=object,而掩码有一个type=int64