Skip to content

Commit aa4dc71

Browse files
BUG: Fix 57735 (#59335)
* Revert "CLN: Remove special cases in indexing ops (#52063)" This reverts commit 8e456d3. * remove old comments, add test * use better test name * Update pandas/tests/indexing/test_loc.py Co-authored-by: Matthew Roeschke <[email protected]> * check for empty index first * assert assign to empty does not change frame * format --------- Co-authored-by: Matthew Roeschke <[email protected]>
1 parent f25a09e commit aa4dc71

File tree

2 files changed

+18
-5
lines changed

2 files changed

+18
-5
lines changed

pandas/core/indexing.py

+11-5
Original file line numberDiff line numberDiff line change
@@ -810,8 +810,11 @@ def _maybe_mask_setitem_value(self, indexer, value):
810810

811811
if is_scalar_indexer(icols, self.ndim - 1) and ndim == 1:
812812
# e.g. test_loc_setitem_boolean_mask_allfalse
813-
# test_loc_setitem_ndframe_values_alignment
814-
value = self.obj.iloc._align_series(indexer, value)
813+
if len(newkey) == 0:
814+
value = value.iloc[:0]
815+
else:
816+
# test_loc_setitem_ndframe_values_alignment
817+
value = self.obj.iloc._align_series(indexer, value)
815818
indexer = (newkey, icols)
816819

817820
elif (
@@ -827,8 +830,11 @@ def _maybe_mask_setitem_value(self, indexer, value):
827830
indexer = (newkey, icols)
828831

829832
elif ndim == 2 and value.shape[1] == 1:
830-
# test_loc_setitem_ndframe_values_alignment
831-
value = self.obj.iloc._align_frame(indexer, value)
833+
if len(newkey) == 0:
834+
value = value.iloc[:0]
835+
else:
836+
# test_loc_setitem_ndframe_values_alignment
837+
value = self.obj.iloc._align_frame(indexer, value)
832838
indexer = (newkey, icols)
833839
elif com.is_bool_indexer(indexer):
834840
indexer = indexer.nonzero()[0]
@@ -2389,7 +2395,7 @@ def ravel(i):
23892395
new_ix = Index([new_ix])
23902396
else:
23912397
new_ix = Index(new_ix)
2392-
if ser.index.equals(new_ix):
2398+
if not len(new_ix) or ser.index.equals(new_ix):
23932399
if using_cow:
23942400
return ser
23952401
return ser._values.copy()

pandas/tests/indexing/test_loc.py

+7
Original file line numberDiff line numberDiff line change
@@ -3272,3 +3272,10 @@ def test_loc_index_alignment_for_series(self):
32723272
df.loc[:, "a"] = other
32733273
expected = DataFrame({"a": [999, 200], "b": [3, 4]})
32743274
tm.assert_frame_equal(expected, df)
3275+
3276+
def test_loc_reindexing_of_empty_index(self):
3277+
# GH 57735
3278+
df = DataFrame(index=[1, 1, 2, 2], data=["1", "1", "2", "2"])
3279+
df.loc[Series([False] * 4, index=df.index, name=0), 0] = df[0]
3280+
expected = DataFrame(index=[1, 1, 2, 2], data=["1", "1", "2", "2"])
3281+
tm.assert_frame_equal(df, expected)

0 commit comments

Comments
 (0)