diff --git a/pandas/core/indexing.py b/pandas/core/indexing.py index b143e1e50aa6c..3ae503c18397a 100644 --- a/pandas/core/indexing.py +++ b/pandas/core/indexing.py @@ -2116,6 +2116,8 @@ def _setitem_with_indexer_missing(self, indexer, value): curr_dtype = self.obj.dtype curr_dtype = getattr(curr_dtype, "numpy_dtype", curr_dtype) new_dtype = maybe_promote(curr_dtype, value)[0] + elif self.obj.empty and is_object_dtype(self.obj.dtype): + new_dtype = self.obj.dtype else: new_dtype = None diff --git a/pandas/tests/indexing/test_loc.py b/pandas/tests/indexing/test_loc.py index b1eaf43f0b368..bb56cb21a1e3c 100644 --- a/pandas/tests/indexing/test_loc.py +++ b/pandas/tests/indexing/test_loc.py @@ -1939,7 +1939,7 @@ def test_loc_setitem_empty_series(self): # GH#5226 # partially set with an empty object series - ser = Series(dtype=object) + ser = Series() ser.loc[1] = 1 tm.assert_series_equal(ser, Series([1], index=[1])) ser.loc[3] = 3 @@ -1949,7 +1949,7 @@ def test_loc_setitem_empty_series_float(self): # GH#5226 # partially set with an empty object series - ser = Series(dtype=object) + ser = Series() ser.loc[1] = 1.0 tm.assert_series_equal(ser, Series([1.0], index=[1])) ser.loc[3] = 3.0 @@ -1959,7 +1959,7 @@ def test_loc_setitem_empty_series_str_idx(self): # GH#5226 # partially set with an empty object series - ser = Series(dtype=object) + ser = Series() ser.loc["foo"] = 1 tm.assert_series_equal(ser, Series([1], index=["foo"])) ser.loc["bar"] = 3 diff --git a/pandas/tests/series/indexing/test_set_value.py b/pandas/tests/series/indexing/test_set_value.py index cbe1a8bf296c8..3bd7d8bc8ce61 100644 --- a/pandas/tests/series/indexing/test_set_value.py +++ b/pandas/tests/series/indexing/test_set_value.py @@ -15,7 +15,7 @@ def test_series_set_value(): dates = [datetime(2001, 1, 1), datetime(2001, 1, 2)] index = DatetimeIndex(dates) - s = Series(dtype=object) + s = Series() s._set_value(dates[0], 1.0) s._set_value(dates[1], np.nan) diff --git a/pandas/tests/series/indexing/test_setitem.py b/pandas/tests/series/indexing/test_setitem.py index 90051405c6935..47fd8bba78326 100644 --- a/pandas/tests/series/indexing/test_setitem.py +++ b/pandas/tests/series/indexing/test_setitem.py @@ -468,14 +468,14 @@ class TestSetitemWithExpansion: def test_setitem_empty_series(self): # GH#10193 key = Timestamp("2012-01-01") - series = Series(dtype=object) + series = Series() series[key] = 47 expected = Series(47, [key]) tm.assert_series_equal(series, expected) def test_setitem_empty_series_datetimeindex_preserves_freq(self): # GH#33573 our index should retain its freq - series = Series([], DatetimeIndex([], freq="D"), dtype=object) + series = Series([], DatetimeIndex([], freq="D")) key = Timestamp("2012-01-01") series[key] = 47 expected = Series(47, DatetimeIndex([key], freq="D")) @@ -1660,3 +1660,18 @@ def test_setitem_empty_mask_dont_upcast_dt64(): ser.mask(mask, "foo", inplace=True) assert ser.dtype == dti.dtype # no-op -> dont upcast tm.assert_series_equal(ser, orig) + + +def test_setitem_on_series_dtype_object(): + # GH#19647 + result = Series(dtype="object") + result.loc["int"] = 1 + result.loc["float"] = 2.0 + expected = Series(data=[1, 2.0], index=["int", "float"]).astype("object") + tm.assert_series_equal(result, expected) + + result = Series() + result.loc["int"] = 1 + result.loc["float"] = 2.0 + expected = Series(data=[1, 2.0], index=["int", "float"]).astype("float") + tm.assert_series_equal(result, expected)