diff --git a/pandas/core/frame.py b/pandas/core/frame.py index 1be7e0736f9fe..7d71cb22f49ed 100644 --- a/pandas/core/frame.py +++ b/pandas/core/frame.py @@ -3095,7 +3095,7 @@ def _ensure_valid_index(self, value): passed value. """ # GH5632, make sure that we are a Series convertible - if not len(self.index) and is_list_like(value): + if not len(self.index) and is_list_like(value) and len(value): try: value = Series(value) except (ValueError, NotImplementedError, TypeError): diff --git a/pandas/tests/frame/test_indexing.py b/pandas/tests/frame/test_indexing.py index ae14563e5952a..a78b2ab7d1c4c 100644 --- a/pandas/tests/frame/test_indexing.py +++ b/pandas/tests/frame/test_indexing.py @@ -821,6 +821,14 @@ def test_setitem_empty_frame_with_boolean(self, dtype, kwargs): df[df > df2] = 47 assert_frame_equal(df, df2) + def test_setitem_with_empty_listlike(self): + # GH #17101 + index = pd.Index([], name="idx") + result = pd.DataFrame(columns=["A"], index=index) + result["A"] = [] + expected = pd.DataFrame(columns=["A"], index=index) + tm.assert_index_equal(result.index, expected.index) + def test_setitem_scalars_no_index(self): # GH16823 / 17894 df = DataFrame() diff --git a/pandas/tests/indexing/test_partial.py b/pandas/tests/indexing/test_partial.py index 68e93f06e43dc..c4505231932c6 100644 --- a/pandas/tests/indexing/test_partial.py +++ b/pandas/tests/indexing/test_partial.py @@ -442,10 +442,10 @@ def test_partial_set_empty_frame(self): # these work as they don't really change # anything but the index # GH5632 - expected = DataFrame(columns=["foo"], index=Index([], dtype="int64")) + expected = DataFrame(columns=["foo"], index=Index([], dtype="object")) def f(): - df = DataFrame() + df = DataFrame(index=Index([], dtype="object")) df["foo"] = Series([], dtype="object") return df @@ -469,22 +469,21 @@ def f(): expected["foo"] = expected["foo"].astype("float64") def f(): - df = DataFrame() + df = DataFrame(index=Index([], dtype="int64")) df["foo"] = [] return df tm.assert_frame_equal(f(), expected) def f(): - df = DataFrame() + df = DataFrame(index=Index([], dtype="int64")) df["foo"] = Series(np.arange(len(df)), dtype="float64") return df tm.assert_frame_equal(f(), expected) def f(): - df = DataFrame() - tm.assert_index_equal(df.index, Index([], dtype="object")) + df = DataFrame(index=Index([], dtype="int64")) df["foo"] = range(len(df)) return df