From ff17872a5a0a90768cb79b153bf3a3a61750f337 Mon Sep 17 00:00:00 2001 From: jreback Date: Mon, 13 Jan 2014 18:18:39 -0500 Subject: [PATCH] BUG: bug in chained assignment with ix and another chained series (GH5928) --- doc/source/release.rst | 1 + pandas/core/indexing.py | 10 +++++++--- pandas/tests/test_indexing.py | 14 ++++++++++++++ 3 files changed, 22 insertions(+), 3 deletions(-) diff --git a/doc/source/release.rst b/doc/source/release.rst index d025baa66aa88..6967c096ae90a 100644 --- a/doc/source/release.rst +++ b/doc/source/release.rst @@ -88,6 +88,7 @@ Bug Fixes - Bug in fully reindexing a Panel (:issue:`5905`) - Bug in idxmin/max with object dtypes (:issue:`5914`) - Bug in ``BusinessDay`` when adding n days to a date not on offset when n>5 and n%5==0 (:issue:`5890`) + - Bug in assigning to chained series with a series via ix (:issue:`5928`) pandas 0.13.0 ------------- diff --git a/pandas/core/indexing.py b/pandas/core/indexing.py index 0697f9d826f97..751c020fecc27 100644 --- a/pandas/core/indexing.py +++ b/pandas/core/indexing.py @@ -421,7 +421,7 @@ def can_do_equal_len(): def _align_series(self, indexer, ser): # indexer to assign Series can be tuple, slice, scalar - if isinstance(indexer, slice): + if isinstance(indexer, (slice, np.ndarray, list)): indexer = tuple([indexer]) if isinstance(indexer, tuple): @@ -453,8 +453,12 @@ def _align_series(self, indexer, ser): all([com._is_sequence(_) for _ in indexer])): ser = ser.reindex(obj.axes[0][indexer[0].ravel()], copy=True).values - l = len(indexer[1].ravel()) - ser = np.tile(ser, l).reshape(l, -1).T + + # single indexer + if len(indexer) > 1: + l = len(indexer[1].ravel()) + ser = np.tile(ser, l).reshape(l, -1).T + return ser for i, idx in enumerate(indexer): diff --git a/pandas/tests/test_indexing.py b/pandas/tests/test_indexing.py index bf1709c78822f..a420dcc7b68e4 100644 --- a/pandas/tests/test_indexing.py +++ b/pandas/tests/test_indexing.py @@ -476,6 +476,20 @@ def test_loc_setitem(self): expected = Series([1,1,0],index=[4,5,6]) assert_series_equal(s, expected) + # GH 5928 + # chained indexing assignment + df = DataFrame({'a' : [0,1,2] }) + expected = df.copy() + expected.ix[[0,1,2],'a'] = -expected.ix[[0,1,2],'a'] + + df['a'].ix[[0,1,2]] = -df['a'].ix[[0,1,2]] + assert_frame_equal(df,expected) + + df = DataFrame({'a' : [0,1,2], 'b' :[0,1,2] }) + df['a'].ix[[0,1,2]] = -df['a'].ix[[0,1,2]].astype('float64') + 0.5 + expected = DataFrame({'a' : [0.5,-0.5,-1.5], 'b' : [0,1,2] }) + assert_frame_equal(df,expected) + def test_loc_getitem_int(self): # int label