Skip to content

BUG: Fix incosistent behavior of 2d-indexed loc-set to Series #59933 #60052

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 28 commits into from
Mar 1, 2025
Merged
Show file tree
Hide file tree
Changes from 4 commits
Commits
Show all changes
28 commits
Select commit Hold shift + click to select a range
1b7dc81
Fix issue #59333
Oct 15, 2024
bab14ff
remove condition
Oct 16, 2024
19a149c
fix case with two slices, test added
Oct 23, 2024
7eeb90b
Merge remote-tracking branch 'upstream/main' into fix59933
Oct 27, 2024
86e44c4
Merge remote-tracking branch 'upstream/main' into fix59933
Oct 30, 2024
27f1122
simpler getting len_indexer (without .loc)
Oct 30, 2024
b287abb
Merge remote-tracking branch 'upstream/main' into fix59933
Nov 15, 2024
dbc9643
Merge remote-tracking branch 'upstream/main' into fix59933
Nov 17, 2024
c7a149c
Used @pytest.mark.parametrize in tests, added whatsnew
Nov 17, 2024
fdc0904
Remove unnecessary parameter
Nov 17, 2024
c66340d
merge actual code to prevent staling
Dec 29, 2024
12d38eb
fix issue with indexing by boolean series
Dec 29, 2024
163dfe3
add unit-test
Dec 29, 2024
2eee4a8
Merge branch 'main' into fix59933
anzber Dec 29, 2024
e2f39e4
remove ipynb and csv from gitignore
Dec 30, 2024
1f857fc
Merge branch 'fix59933' of github.com:anzber/pandas into fix59933
Dec 30, 2024
123899c
Merge remote-tracking branch 'upstream/main' into fix59933
Dec 30, 2024
292158d
Merge branch 'main' into fix59933
anzber Dec 30, 2024
706a7e7
Merge branch 'main' into fix59933
anzber Jan 13, 2025
aee5936
Merge branch 'main' into fix59933
anzber Jan 13, 2025
548c08b
Merge remote-tracking branch 'upstream/main' into fix59933
Jan 13, 2025
aba0135
Merge branch 'main' into fix59933
anzber Feb 5, 2025
89c52e7
Merge remote-tracking branch 'upstream/main' into fix59933
Feb 20, 2025
379007f
Merge branch 'fix59933' of github.com:anzber/pandas into fix59933
Feb 20, 2025
705c0c5
Merge branch 'main' into fix59933
anzber Feb 20, 2025
7504030
Merge branch 'main' into fix59933
anzber Feb 22, 2025
5bb12fb
fix issue number
anzber Feb 22, 2025
d2c8ab8
Update v3.0.0.rst fix issue number again
anzber Feb 24, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 5 additions & 2 deletions pandas/core/indexing.py
Original file line number Diff line number Diff line change
Expand Up @@ -2371,12 +2371,15 @@ def ravel(i):

# we have a frame, with multiple indexers on both axes; and a
# series, so need to broadcast (see GH5206)
if sum_aligners == self.ndim and all(is_sequence(_) for _ in indexer):
if all(is_sequence(_) or isinstance(_, slice) for _ in indexer):
ser_values = ser.reindex(obj.axes[0][indexer[0]])._values

# single indexer
if len(indexer) > 1 and not multiindex_indexer:
len_indexer = len(indexer[1])
if isinstance(indexer[1], slice):
len_indexer = len(obj.loc[indexer[1]].axes[1])
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think you can use axes[1][indexer[1]] instead of .loc.

Copy link
Contributor Author

@anzber anzber Nov 5, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I've made changes requested, but failed test appeared

else:
len_indexer = len(indexer[1])
ser_values = (
np.tile(ser_values, len_indexer).reshape(len_indexer, -1).T
)
Expand Down
40 changes: 40 additions & 0 deletions pandas/tests/indexing/test_loc.py
Original file line number Diff line number Diff line change
Expand Up @@ -3297,3 +3297,43 @@ def test_loc_reindexing_of_empty_index(self):
df.loc[Series([False] * 4, index=df.index, name=0), 0] = df[0]
expected = DataFrame(index=[1, 1, 2, 2], data=["1", "1", "2", "2"])
tm.assert_frame_equal(df, expected)

def test_loc_set_series_to_multiple_columns(self):
# GH 59933
df = DataFrame([[1, 2, 3], [4, 5, 6]], columns=list("ABC"))
df.loc[0:3, ["A", "B", "C"]] = Series([10, 20, 30])
expected = DataFrame([[10, 10, 10], [20, 20, 20]], columns=list("ABC"))
tm.assert_frame_equal(df, expected)

df = DataFrame([[1, 2, 3], [4, 5, 6]], columns=list("ABC"))
df.loc[:, ["A", "B", "C"]] = Series([10, 20, 30])
expected = DataFrame([[10, 10, 10], [20, 20, 20]], columns=list("ABC"))
tm.assert_frame_equal(df, expected)

df = DataFrame([[1, 2, 3], [4, 5, 6], [7, 8, 9]], columns=list("ABC"))
df.loc[df["A"] > 0, ["A", "B", "C"]] = Series([10, 20, 30])
expected = DataFrame(
[[10, 10, 10], [20, 20, 20], [30, 30, 30]], columns=list("ABC")
)
tm.assert_frame_equal(df, expected)

df = DataFrame([[1, 2, 3], [4, 5, 6], [7, 8, 9]], columns=list("ABC"))
df.loc[:, ["A", "B", "C"]] = Series([10, 20, 30])
expected = DataFrame(
[[10, 10, 10], [20, 20, 20], [30, 30, 30]], columns=list("ABC")
)
tm.assert_frame_equal(df, expected)

df = DataFrame([[1, 2, 3], [4, 5, 6], [7, 8, 9]], columns=list("ABC"))
df.loc[0:4, ["A", "B", "C"]] = Series([10, 20, 30])
expected = DataFrame(
[[10, 10, 10], [20, 20, 20], [30, 30, 30]], columns=list("ABC")
)
tm.assert_frame_equal(df, expected)

df = DataFrame([[1, 2, 3], [4, 5, 6], [7, 8, 9]], columns=list("ABC"))
df.loc[:, "A":"C"] = Series([10, 20, 30])
expected = DataFrame(
[[10, 10, 10], [20, 20, 20], [30, 30, 30]], columns=list("ABC")
)
tm.assert_frame_equal(df, expected)