Skip to content

Commit fc07edb

Browse files
committed
Merge pull request #6542 from jreback/dup_assign
BUG: Bug in setitem with a duplicate index and an alignable rhs (GH6541)
2 parents 28f3af4 + 3f2fc32 commit fc07edb

File tree

4 files changed

+34
-3
lines changed

4 files changed

+34
-3
lines changed

doc/source/release.rst

+1
Original file line numberDiff line numberDiff line change
@@ -199,6 +199,7 @@ Bug Fixes
199199
- Bug that caused _ref_locs corruption when slice indexing across columns axis of a DataFrame (:issue:`6525`)
200200
- Regression from 0.13 in the treatmenet of numpy ``datetime64`` non-ns dtypes in Series creation (:issue:`6529`)
201201
- ``.names`` attribute of MultiIndexes passed to ``set_index`` are now preserved (:issue:`6459`).
202+
- Bug in setitem with a duplicate index and an alignable rhs (:issue:`6541`)
202203

203204
pandas 0.13.1
204205
-------------

pandas/core/index.py

+7-2
Original file line numberDiff line numberDiff line change
@@ -987,8 +987,13 @@ def intersection(self, other):
987987
except TypeError:
988988
pass
989989

990-
indexer = self.get_indexer(other.values)
991-
indexer = indexer.take((indexer != -1).nonzero()[0])
990+
try:
991+
indexer = self.get_indexer(other.values)
992+
indexer = indexer.take((indexer != -1).nonzero()[0])
993+
except:
994+
# duplicates
995+
indexer = self.get_indexer_non_unique(other.values)[0].unique()
996+
992997
return self.take(indexer)
993998

994999
def diff(self, other):

pandas/core/indexing.py

+3-1
Original file line numberDiff line numberDiff line change
@@ -441,7 +441,9 @@ def can_do_equal_len():
441441
# align to
442442
if item in value:
443443
v = value[item]
444-
v = v.reindex(self.obj[item].index & v.index)
444+
i = self.obj[item].index
445+
v = v.reindex(i & v.index)
446+
445447
setter(item, v.values)
446448
else:
447449
setter(item, np.nan)

pandas/tests/test_indexing.py

+23
Original file line numberDiff line numberDiff line change
@@ -564,6 +564,29 @@ def test_loc_setitem(self):
564564
expected = DataFrame({'a' : [0.5,-0.5,-1.5], 'b' : [0,1,2] })
565565
assert_frame_equal(df,expected)
566566

567+
def test_loc_setitem_dups(self):
568+
569+
# GH 6541
570+
df_orig = DataFrame({'me' : list('rttti'),
571+
'foo': list('aaade'),
572+
'bar': np.arange(5,dtype='float64')*1.34+2,
573+
'bar2': np.arange(5,dtype='float64')*-.34+2}).set_index('me')
574+
575+
indexer = tuple(['r',['bar','bar2']])
576+
df = df_orig.copy()
577+
df.loc[indexer]*=2.0
578+
assert_series_equal(df.loc[indexer],2.0*df_orig.loc[indexer])
579+
580+
indexer = tuple(['r','bar'])
581+
df = df_orig.copy()
582+
df.loc[indexer]*=2.0
583+
self.assertEqual(df.loc[indexer],2.0*df_orig.loc[indexer])
584+
585+
indexer = tuple(['t',['bar','bar2']])
586+
df = df_orig.copy()
587+
df.loc[indexer]*=2.0
588+
assert_frame_equal(df.loc[indexer],2.0*df_orig.loc[indexer])
589+
567590
def test_chained_getitem_with_lists(self):
568591

569592
# GH6394

0 commit comments

Comments
 (0)