Skip to content

Commit 451dce4

Browse files
committed
Merge pull request #5930 from jreback/indexer
BUG: bug in chained assignment with ix and another chained series (GH5928)
2 parents 89ba31b + ff17872 commit 451dce4

File tree

3 files changed

+22
-3
lines changed

3 files changed

+22
-3
lines changed

doc/source/release.rst

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,7 @@ Bug Fixes
8888
- Bug in fully reindexing a Panel (:issue:`5905`)
8989
- Bug in idxmin/max with object dtypes (:issue:`5914`)
9090
- Bug in ``BusinessDay`` when adding n days to a date not on offset when n>5 and n%5==0 (:issue:`5890`)
91+
- Bug in assigning to chained series with a series via ix (:issue:`5928`)
9192

9293
pandas 0.13.0
9394
-------------

pandas/core/indexing.py

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -421,7 +421,7 @@ def can_do_equal_len():
421421

422422
def _align_series(self, indexer, ser):
423423
# indexer to assign Series can be tuple, slice, scalar
424-
if isinstance(indexer, slice):
424+
if isinstance(indexer, (slice, np.ndarray, list)):
425425
indexer = tuple([indexer])
426426

427427
if isinstance(indexer, tuple):
@@ -453,8 +453,12 @@ def _align_series(self, indexer, ser):
453453
all([com._is_sequence(_) for _ in indexer])):
454454
ser = ser.reindex(obj.axes[0][indexer[0].ravel()],
455455
copy=True).values
456-
l = len(indexer[1].ravel())
457-
ser = np.tile(ser, l).reshape(l, -1).T
456+
457+
# single indexer
458+
if len(indexer) > 1:
459+
l = len(indexer[1].ravel())
460+
ser = np.tile(ser, l).reshape(l, -1).T
461+
458462
return ser
459463

460464
for i, idx in enumerate(indexer):

pandas/tests/test_indexing.py

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -476,6 +476,20 @@ def test_loc_setitem(self):
476476
expected = Series([1,1,0],index=[4,5,6])
477477
assert_series_equal(s, expected)
478478

479+
# GH 5928
480+
# chained indexing assignment
481+
df = DataFrame({'a' : [0,1,2] })
482+
expected = df.copy()
483+
expected.ix[[0,1,2],'a'] = -expected.ix[[0,1,2],'a']
484+
485+
df['a'].ix[[0,1,2]] = -df['a'].ix[[0,1,2]]
486+
assert_frame_equal(df,expected)
487+
488+
df = DataFrame({'a' : [0,1,2], 'b' :[0,1,2] })
489+
df['a'].ix[[0,1,2]] = -df['a'].ix[[0,1,2]].astype('float64') + 0.5
490+
expected = DataFrame({'a' : [0.5,-0.5,-1.5], 'b' : [0,1,2] })
491+
assert_frame_equal(df,expected)
492+
479493
def test_loc_getitem_int(self):
480494

481495
# int label

0 commit comments

Comments
 (0)