From 29b7168dcad9272aa9970eb00e97ad66f66ab0a1 Mon Sep 17 00:00:00 2001 From: jreback Date: Wed, 18 Dec 2013 20:02:15 -0500 Subject: [PATCH] BUG: raise KeyError if missing value in py3 on multi-index (GH5725), revisited --- pandas/core/index.py | 3 +++ pandas/tests/test_indexing.py | 23 ++++++++++++++++++++++- 2 files changed, 25 insertions(+), 1 deletion(-) diff --git a/pandas/core/index.py b/pandas/core/index.py index 30f93564db318..5c77c1e5e9516 100644 --- a/pandas/core/index.py +++ b/pandas/core/index.py @@ -2306,8 +2306,11 @@ def _try_mi(k): compat.PY3 and isinstance(key, compat.string_types)): try: return _try_mi(key) + except (KeyError): + raise except: pass + try: return _try_mi(Timestamp(key)) except: diff --git a/pandas/tests/test_indexing.py b/pandas/tests/test_indexing.py index e601755ba8aaf..3107b1c679cc7 100644 --- a/pandas/tests/test_indexing.py +++ b/pandas/tests/test_indexing.py @@ -844,15 +844,36 @@ def test_getitem_multiindex(self): # GH 5725 # the 'A' happens to be a valid Timestamp so the doesn't raise the appropriate # error, only in PY3 of course! - index = MultiIndex(levels=[['A', 'B', 'C'], [0, 26, 27, 37, 57, 67, 75, 82]], + index = MultiIndex(levels=[['D', 'B', 'C'], [0, 26, 27, 37, 57, 67, 75, 82]], labels=[[0, 0, 0, 1, 2, 2, 2, 2, 2, 2], [1, 3, 4, 6, 0, 2, 2, 3, 5, 7]], names=['tag', 'day']) arr = np.random.randn(len(index),1) df = DataFrame(arr,index=index,columns=['val']) + result = df.val['D'] + expected = Series(arr.ravel()[0:3],name='val',index=Index([26,37,57],name='day')) + assert_series_equal(result,expected) + + def f(): + df.val['A'] + self.assertRaises(KeyError, f) + + def f(): + df.val['X'] + self.assertRaises(KeyError, f) + + # A is treated as a special Timestamp + index = MultiIndex(levels=[['A', 'B', 'C'], [0, 26, 27, 37, 57, 67, 75, 82]], + labels=[[0, 0, 0, 1, 2, 2, 2, 2, 2, 2], [1, 3, 4, 6, 0, 2, 2, 3, 5, 7]], + names=['tag', 'day']) + df = DataFrame(arr,index=index,columns=['val']) result = df.val['A'] expected = Series(arr.ravel()[0:3],name='val',index=Index([26,37,57],name='day')) assert_series_equal(result,expected) + def f(): + df.val['X'] + self.assertRaises(KeyError, f) + def test_setitem_dtype_upcast(self): # GH3216