From 6d56e7300d66d3ba76684334bbb44b6cd0ea9f61 Mon Sep 17 00:00:00 2001 From: jreback Date: Tue, 4 Feb 2014 14:34:03 -0500 Subject: [PATCH] BUG: Indexing bugs with reordered indexes (GH6252, GH6254) --- doc/source/release.rst | 1 + pandas/core/internals.py | 3 ++- pandas/tests/test_indexing.py | 26 ++++++++++++++++++++++++++ 3 files changed, 29 insertions(+), 1 deletion(-) diff --git a/doc/source/release.rst b/doc/source/release.rst index 7707c945f7a54..cf4037303dcfa 100644 --- a/doc/source/release.rst +++ b/doc/source/release.rst @@ -73,6 +73,7 @@ Bug Fixes - Bug in version string gen. for dev versions with shallow clones / install from tarball (:issue:`6127`) - Inconsistent tz parsing Timestamp/to_datetime for current year (:issue:`5958`) +- Indexing bugs with reordered indexes (:issue:`6252`, :issue:`6254`) pandas 0.13.1 ------------- diff --git a/pandas/core/internals.py b/pandas/core/internals.py index 2c58dd34939e7..e88f1972b5f7d 100644 --- a/pandas/core/internals.py +++ b/pandas/core/internals.py @@ -633,7 +633,8 @@ def setitem(self, indexer, value): # if we are an exact match (ex-broadcasting), # then use the resultant dtype elif len(arr_value.shape) and arr_value.shape[0] == values.shape[0] and np.prod(arr_value.shape) == np.prod(values.shape): - values = arr_value.reshape(values.shape) + values[indexer] = value + values = values.astype(arr_value.dtype) # set else: diff --git a/pandas/tests/test_indexing.py b/pandas/tests/test_indexing.py index 435b0ca5d722f..4a641cad68885 100644 --- a/pandas/tests/test_indexing.py +++ b/pandas/tests/test_indexing.py @@ -646,6 +646,32 @@ def test_loc_setitem_frame(self): result = df.ix[:,1:] assert_frame_equal(result, expected) + # GH 6254 + # setting issue + df = DataFrame(index=[3, 5, 4], columns=['A']) + df.loc[[4, 3, 5], 'A'] = [1, 2, 3] + expected = DataFrame(dict(A = Series([1,2,3],index=[4, 3, 5]))).reindex(index=[3,5,4]) + assert_frame_equal(df, expected) + + # GH 6252 + # setting with an empty frame + keys1 = ['@' + str(i) for i in range(5)] + val1 = np.arange(5) + + keys2 = ['@' + str(i) for i in range(4)] + val2 = np.arange(4) + + index = list(set(keys1).union(keys2)) + df = DataFrame(index = index) + df['A'] = nan + df.loc[keys1, 'A'] = val1 + + df['B'] = nan + df.loc[keys2, 'B'] = val2 + + expected = DataFrame(dict(A = Series(val1,index=keys1), B = Series(val2,index=keys2))).reindex(index=index) + assert_frame_equal(df, expected) + def test_loc_setitem_frame_multiples(self): # multiple setting