diff --git a/doc/source/release.rst b/doc/source/release.rst index 59ff48887269e..9516b67d4ca47 100644 --- a/doc/source/release.rst +++ b/doc/source/release.rst @@ -805,6 +805,8 @@ Bug Fixes - ``pd.to_timedelta`` of a scalar returns a scalar (:issue:`5410`) - ``pd.to_timedelta`` accepts ``NaN`` and ``NaT``, returning ``NaT`` instead of raising (:issue:`5437`) - performance improvements in ``isnull`` on larger size pandas objects + - Fixed various setitem with 1d ndarray that does not have a matching + length to the indexer (:issue:`5508`) pandas 0.12.0 ------------- diff --git a/pandas/core/indexing.py b/pandas/core/indexing.py index c854e0b086994..b462624dde1f5 100644 --- a/pandas/core/indexing.py +++ b/pandas/core/indexing.py @@ -365,6 +365,10 @@ def can_do_equal_len(): # per label values else: + if len(labels) != len(value): + raise ValueError('Must have equal len keys and value when' + ' setting with an iterable') + for item, v in zip(labels, value): setter(item, v) else: diff --git a/pandas/tests/test_indexing.py b/pandas/tests/test_indexing.py index dacac6ef64b29..e01fd6a763ceb 100644 --- a/pandas/tests/test_indexing.py +++ b/pandas/tests/test_indexing.py @@ -650,6 +650,35 @@ def test_iloc_getitem_frame(self): # trying to use a label self.assertRaises(ValueError, df.iloc.__getitem__, tuple(['j','D'])) + def test_setitem_ndarray_1d(self): + # GH5508 + + # len of indexer vs length of the 1d ndarray + df = DataFrame(index=Index(lrange(1,11))) + df['foo'] = np.zeros(10, dtype=np.float64) + df['bar'] = np.zeros(10, dtype=np.complex) + + # invalid + def f(): + df.ix[2:5, 'bar'] = np.array([2.33j, 1.23+0.1j, 2.2]) + self.assertRaises(ValueError, f) + + # valid + df.ix[2:5, 'bar'] = np.array([2.33j, 1.23+0.1j, 2.2, 1.0]) + + result = df.ix[2:5, 'bar'] + expected = Series([2.33j, 1.23+0.1j, 2.2, 1.0],index=[2,3,4,5]) + assert_series_equal(result,expected) + + # dtype getting changed? + df = DataFrame(index=Index(lrange(1,11))) + df['foo'] = np.zeros(10, dtype=np.float64) + df['bar'] = np.zeros(10, dtype=np.complex) + + def f(): + df[2:5] = np.arange(1,4)*1j + self.assertRaises(ValueError, f) + def test_iloc_setitem_series(self): """ originally from test_series.py """ df = DataFrame(np.random.randn(10, 4), index=list('abcdefghij'), columns=list('ABCD'))