From 30e83ae284798b6396d003dff9478d8a7b008f5e Mon Sep 17 00:00:00 2001 From: weikhor Date: Mon, 15 Aug 2022 23:04:06 +0800 Subject: [PATCH 1/6] type --- pandas/core/series.py | 1 + 1 file changed, 1 insertion(+) diff --git a/pandas/core/series.py b/pandas/core/series.py index 20f0ecd06fbd1..dd0eea0ff4256 100644 --- a/pandas/core/series.py +++ b/pandas/core/series.py @@ -468,6 +468,7 @@ def __init__( data = data.copy() else: data = sanitize_array(data, index, dtype, copy) + data = data.astype(index.dtype) manager = get_option("mode.data_manager") if manager == "block": From 2cbc2e97aa0f971ef83bdb9f26d932876c1a948e Mon Sep 17 00:00:00 2001 From: weikhor Date: Tue, 16 Aug 2022 21:18:49 +0800 Subject: [PATCH 2/6] object --- pandas/core/indexing.py | 3 ++- pandas/core/series.py | 1 - pandas/tests/series/indexing/test_setitem.py | 15 +++++++++++++++ 3 files changed, 17 insertions(+), 2 deletions(-) diff --git a/pandas/core/indexing.py b/pandas/core/indexing.py index b143e1e50aa6c..a787f4040ca0b 100644 --- a/pandas/core/indexing.py +++ b/pandas/core/indexing.py @@ -2117,7 +2117,8 @@ def _setitem_with_indexer_missing(self, indexer, value): curr_dtype = getattr(curr_dtype, "numpy_dtype", curr_dtype) new_dtype = maybe_promote(curr_dtype, value)[0] else: - new_dtype = None + if isinstance(self.obj.dtype, object): + new_dtype = self.obj.dtype new_values = Series([value], dtype=new_dtype)._values diff --git a/pandas/core/series.py b/pandas/core/series.py index dd0eea0ff4256..20f0ecd06fbd1 100644 --- a/pandas/core/series.py +++ b/pandas/core/series.py @@ -468,7 +468,6 @@ def __init__( data = data.copy() else: data = sanitize_array(data, index, dtype, copy) - data = data.astype(index.dtype) manager = get_option("mode.data_manager") if manager == "block": diff --git a/pandas/tests/series/indexing/test_setitem.py b/pandas/tests/series/indexing/test_setitem.py index 244ad9884b82a..16f95d16060f6 100644 --- a/pandas/tests/series/indexing/test_setitem.py +++ b/pandas/tests/series/indexing/test_setitem.py @@ -1665,3 +1665,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) From d0c9c2b1c5fc8795c942af4972ae2b16562a041d Mon Sep 17 00:00:00 2001 From: weikhor Date: Wed, 17 Aug 2022 21:46:49 +0800 Subject: [PATCH 3/6] add change --- pandas/core/indexing.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/pandas/core/indexing.py b/pandas/core/indexing.py index a787f4040ca0b..38175801ec0b5 100644 --- a/pandas/core/indexing.py +++ b/pandas/core/indexing.py @@ -2116,9 +2116,10 @@ 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 is_object_dtype(self.obj.dtype): + # new_dtype = self.obj.dtype else: - if isinstance(self.obj.dtype, object): - new_dtype = self.obj.dtype + new_dtype = None new_values = Series([value], dtype=new_dtype)._values From cf5a8e876e49f2612d8f1a908bae66b802933e52 Mon Sep 17 00:00:00 2001 From: weikhor Date: Wed, 17 Aug 2022 21:47:23 +0800 Subject: [PATCH 4/6] add object --- pandas/core/indexing.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pandas/core/indexing.py b/pandas/core/indexing.py index 38175801ec0b5..64579cd793053 100644 --- a/pandas/core/indexing.py +++ b/pandas/core/indexing.py @@ -2116,8 +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 is_object_dtype(self.obj.dtype): - # new_dtype = self.obj.dtype + elif is_object_dtype(self.obj.dtype): + new_dtype = self.obj.dtype else: new_dtype = None From 293c8361bc2fa68c2c5414d63c91f50001cc4e4f Mon Sep 17 00:00:00 2001 From: weikhor Date: Thu, 18 Aug 2022 22:43:53 +0800 Subject: [PATCH 5/6] add test --- pandas/core/indexing.py | 2 +- pandas/tests/series/indexing/test_set_value.py | 2 +- pandas/tests/series/indexing/test_setitem.py | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/pandas/core/indexing.py b/pandas/core/indexing.py index 64579cd793053..3ae503c18397a 100644 --- a/pandas/core/indexing.py +++ b/pandas/core/indexing.py @@ -2116,7 +2116,7 @@ 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 is_object_dtype(self.obj.dtype): + 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/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 16f95d16060f6..3112681b93c11 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")) From 647eff0f70499f93b408764dd5ac65073ef640f6 Mon Sep 17 00:00:00 2001 From: weikhor Date: Thu, 18 Aug 2022 23:30:34 +0800 Subject: [PATCH 6/6] update test --- pandas/tests/indexing/test_loc.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/pandas/tests/indexing/test_loc.py b/pandas/tests/indexing/test_loc.py index a7c03c672be58..e02fd5b4350a4 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