Skip to content

Commit 72ba35b

Browse files
Increase edge case check strictness when cols_droplevel contains empty values (#62527)
1 parent 2110ba6 commit 72ba35b

File tree

2 files changed

+26
-0
lines changed

2 files changed

+26
-0
lines changed

pandas/core/frame.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -107,6 +107,7 @@
107107
is_list_like,
108108
is_scalar,
109109
is_sequence,
110+
is_string_dtype,
110111
needs_i8_conversion,
111112
pandas_dtype,
112113
)
@@ -4454,8 +4455,12 @@ def _set_item_frame_value(self, key, value: DataFrame) -> None:
44544455
cols_droplevel = maybe_droplevels(cols, key)
44554456
if (
44564457
not isinstance(cols_droplevel, MultiIndex)
4458+
and is_string_dtype(cols_droplevel.dtype)
44574459
and not cols_droplevel.any()
44584460
):
4461+
# if cols_droplevel contains only empty strings,
4462+
# value.reindex(cols_droplevel, axis=1) would be full of NaNs
4463+
# see GH#62518 and GH#61841
44594464
return
44604465
if len(cols_droplevel) and not cols_droplevel.equals(value.columns):
44614466
value = value.reindex(cols_droplevel, axis=1)

pandas/tests/indexing/multiindex/test_multiindex.py

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -271,3 +271,24 @@ def test_multiindex_assign_aligns_as_implicit_tuple(self):
271271
df1["C"] = s1
272272
tm.assert_frame_equal(df1, df2)
273273
tm.assert_frame_equal(df1, df3)
274+
275+
def test_multiindex_assign_alignment_with_non_string_dtype(self):
276+
# GH 62518
277+
columns = MultiIndex.from_arrays(
278+
[["a", "a", "z", "z"], pd.Categorical([1, 2, 1, 2])]
279+
)
280+
281+
meta = DataFrame(columns=columns, dtype=object)
282+
meta["z"] = meta["z"].astype("int64")
283+
284+
result = DataFrame(
285+
data={
286+
("a", 1): Series([], dtype=object),
287+
("a", 2): Series([], dtype=object),
288+
("z", 1): Series([], dtype="int64"),
289+
("z", 2): Series([], dtype="int64"),
290+
},
291+
columns=columns,
292+
)
293+
294+
tm.assert_frame_equal(meta, result)

0 commit comments

Comments
 (0)