From 63205caf65f5041b6cfffe5b036163b9aeef1e61 Mon Sep 17 00:00:00 2001 From: phofl Date: Thu, 31 Dec 2020 00:01:40 +0100 Subject: [PATCH 1/2] Fix 38831 first step --- pandas/core/frame.py | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/pandas/core/frame.py b/pandas/core/frame.py index 7f295a73a82e6..431fbb4d423e3 100644 --- a/pandas/core/frame.py +++ b/pandas/core/frame.py @@ -3316,13 +3316,14 @@ def _ensure_valid_index(self, value): """ # GH5632, make sure that we are a Series convertible if not len(self.index) and is_list_like(value) and len(value): - try: - value = Series(value) - except (ValueError, NotImplementedError, TypeError) as err: - raise ValueError( - "Cannot set a frame with no defined index " - "and a value that cannot be converted to a Series" - ) from err + if not isinstance(value, DataFrame): + try: + value = Series(value) + except (ValueError, NotImplementedError, TypeError) as err: + raise ValueError( + "Cannot set a frame with no defined index " + "and a value that cannot be converted to a Series" + ) from err # GH31368 preserve name of index index_copy = value.index.copy() From 629cddec89a2d8bffb4d066cd792cc43976254ed Mon Sep 17 00:00:00 2001 From: phofl Date: Sun, 3 Jan 2021 23:12:48 +0100 Subject: [PATCH 2/2] BUG: DataFrame.__setitem__ raising ValueError with string indexer and empty df and df to set --- doc/source/whatsnew/v1.3.0.rst | 1 + pandas/tests/frame/indexing/test_setitem.py | 10 ++++++++++ 2 files changed, 11 insertions(+) diff --git a/doc/source/whatsnew/v1.3.0.rst b/doc/source/whatsnew/v1.3.0.rst index 83bff6d7bfb2d..8ab044514bafe 100644 --- a/doc/source/whatsnew/v1.3.0.rst +++ b/doc/source/whatsnew/v1.3.0.rst @@ -233,6 +233,7 @@ Indexing ^^^^^^^^ - Bug in :meth:`CategoricalIndex.get_indexer` failing to raise ``InvalidIndexError`` when non-unique (:issue:`38372`) - Bug in inserting many new columns into a :class:`DataFrame` causing incorrect subsequent indexing behavior (:issue:`38380`) +- Bug in :meth:`DataFrame.__setitem__` raising ``ValueError`` with empty :class:`DataFrame` and specified columns for string indexer and non empty :class:`DataFrame` to set (:issue:`38831`) - Bug in :meth:`DataFrame.iloc.__setitem__` and :meth:`DataFrame.loc.__setitem__` with mixed dtypes when setting with a dictionary value (:issue:`38335`) - - diff --git a/pandas/tests/frame/indexing/test_setitem.py b/pandas/tests/frame/indexing/test_setitem.py index 19d2f8301037a..28b1f02ff020c 100644 --- a/pandas/tests/frame/indexing/test_setitem.py +++ b/pandas/tests/frame/indexing/test_setitem.py @@ -338,6 +338,16 @@ def test_setitem_bool_with_numeric_index(self, dtype): tm.assert_index_equal(df.columns, expected_cols) + @pytest.mark.parametrize("indexer", ["B", ["B"]]) + def test_setitem_frame_length_0_str_key(self, indexer): + # GH#38831 + df = DataFrame(columns=["A", "B"]) + other = DataFrame({"B": [1, 2]}) + df[indexer] = other + expected = DataFrame({"A": [np.nan] * 2, "B": [1, 2]}) + expected["A"] = expected["A"].astype("object") + tm.assert_frame_equal(df, expected) + class TestDataFrameSetItemWithExpansion: def test_setitem_listlike_views(self):