2015-06-01 27 views
2

爲什麼我會在一個案例中遇到KeyError,而在另一個案例中卻沒有?見下文。pandas:KeyError在一個案例中,但在其他類似案例中不存在

>>> import pandas as pd 
>>> s1 = pd.Series([10, 20, 30, 40], index=list('abcd')) 
>>> s2 = pd.Series([10, 20, 30, 40], index=list('acbd')) 
>>> s1.loc['a':'z'] 
a 10 
b 20 
c 30 
d 40 
dtype: int64 
>>> s2.loc['a':'z'] 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "/path/lib/python2.7/site-packages/pandas/core/series.py", line 559, in __getitem__ 
    return self._get_with(key) 
    File "/path/lib/python2.7/site-packages/pandas/core/series.py", line 564, in _get_with 
    indexer = self.index._convert_slice_indexer(key, kind='getitem') 
    File "/path/lib/python2.7/site-packages/pandas/core/index.py", line 871, in _convert_slice_indexer 
    key, is_index_slice=is_index_slice) 
    File "/path/lib/python2.7/site-packages/pandas/core/index.py", line 806, in _convert_slice_indexer_getitem 
    return self._convert_slice_indexer(key) 
    File "/path/lib/python2.7/site-packages/pandas/core/index.py", line 893, in _convert_slice_indexer 
    indexer = self.slice_indexer(start, stop, step) 
    File "/path/lib/python2.7/site-packages/pandas/core/index.py", line 2346, in slice_indexer 
    start_slice, end_slice = self.slice_locs(start, end, step=step, kind=kind) 
    File "/path/lib/python2.7/site-packages/pandas/core/index.py", line 2496, in slice_locs 
    end_slice = self.get_slice_bound(end, 'right', kind) 
    File "/path/lib/python2.7/site-packages/pandas/core/index.py", line 2438, in get_slice_bound 
    raise err 
KeyError: 'z' 

更新: 答案之一說,這可能是因爲s1.index.is_monotonic是真實的。但這裏is_monotonicFalse,但沒有KeyError

>>> s3 = pd.Series([10, 20, 30, 40], index=list('dcba')) 
>>> s3['z':'a'] 
d 10 
c 20 
b 30 
a 40 
dtype: int64 
>>> s3.index.is_monotonic 
False 

的Python v2.7.5,熊貓v0.16.1

+0

我可以證實0.16.1表現出您描述的行爲。奇怪的是,熊貓0.15.2給兩個DataFrames提供了一個錯誤:''stop bound [z]不在[index]中'。 – chrisaycock

+0

關於你的更新:'s3.index.is_monotonic_decreasing'是'True'。 – chrisaycock

回答

1

我認爲這歸結爲一個事實,即t指標不是單調的,即沒有排序。排序/單調索引允許一些行爲對於未排序的行爲是不可能的。

s.index.is_monotonic 
Out[15]: True 

t.index.is_monotonic 
Out[16]: False 

這在docs on multi-indexing簡單地提到,但顯然這並不完全在你的案件,不適用,我不知道去哪裏怎麼切的排序/未分類指數作品的一個很好的概述。

+0

很好的瞭解'is_monotonic',但是下面的例子成功了,儘管is_monotonic是false: >>> s2 = pd.Series([10,20,30,40],index = list('dcba')) >>> S2 [ 'd': 'A'] d 10 -C 20 b 30 d型細胞:int64類型 >>> s2.index.is_monotonic 假 我將編輯後,以反映這個。 – user650654

相關問題