Skip to main content
 首页 » 编程设计

python之IndexingError 使用 bool 索引

2025年05月04日16softidea

我正在尝试使用类似于 here 的 bool 系列索引数据框

In [1]: import pandas as pd 
In [2]: idx = pd.Index(["USD.CAD", "AUD.NZD", "EUR.USD", "GBP.USD"], 
   ...:                name="Currency Pair") 
In [3]: pairs = pd.DataFrame({"mean":[3.6,5.1,3.6,2.7], "count":[1,5,8,2]}, index=idx) 
In [4]: mask = pairs.reset_index().loc[:,"Currency Pair"].str.contains("USD") 
 
In [5]: pairs.reset_index()[mask] 
Out[5]:  
  Currency Pair  count  mean 
0       USD.CAD      1   3.6 
2       EUR.USD      8   3.6 
3       GBP.USD      2   2.7 

上面的代码按预期工作但是当我尝试使用没有索引重置的原始数据帧时我得到以下错误

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 

我对这个错误感到困惑,因为我的印象是如果 bool 索引长度与数据帧的长度不同,这是收到的错误?如下所示,情况并非如此。

In [7]: len(mask) 
Out[7]: 4 
In [8]: len(pairs) 
Out[8]: 4 
In [9]: len(pairs.reset_index()) 
Out[9]: 4 

请您参考如下方法:

我想我会记下评论中指出的@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