-
-
Notifications
You must be signed in to change notification settings - Fork 18.4k
BUG: Fix bug in loc setitem changing the dtype when condition is False #37672
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
Changes from 12 commits
9df9c89
6e0ec24
26b7dae
11d27b1
a527342
722cf9d
345b3c1
8c57c09
3b92d31
97203de
2f7bf13
eb3b204
9d59de4
b02e629
b27c825
8edc7d0
e57e407
6506df5
8cdef72
c14d7b2
01d7ffc
da94459
85120c9
bae602e
824c927
6871ae9
56f4f76
d334c7a
f12ef06
131d168
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -339,3 +339,14 @@ def test_setitem_boolean_mask(self, mask_type, float_frame): | |
expected = df.copy() | ||
expected.values[np.array(mask)] = np.nan | ||
tm.assert_frame_equal(result, expected) | ||
|
||
def test_setitem_loc_only_false_indexer_dtype_changed(self): | ||
# GH#37550 | ||
# Dtype is only changed when value to set is a Series | ||
df = DataFrame({"a": ["a"], "b": [1], "c": [1]}) | ||
df.loc[[False], ["b"]] = 10 - df["c"] | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. can you make clear either in the test name and/or comment that/whether the type of indexer for There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Added comment and parametrized test |
||
expected = DataFrame({"a": ["a"], "b": [1], "c": [1]}) | ||
jreback marked this conversation as resolved.
Show resolved
Hide resolved
|
||
tm.assert_frame_equal(df, expected) | ||
|
||
df.loc[[False], ["b"]] = 10 - 1 | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. you can simplify to 9 There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Thx |
||
tm.assert_frame_equal(df, expected) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
im not sure this is the right place to catch this, since i think we are specifically interested in all-False boolean indexers coming through loc. does this get here via setitem_with_indexer, and if so, can you point out specifically which branch(es)?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Through
_setitem_with_indexer_split_path
->_setitem_with_indexer_2d_value
->_setitem_single_column
as mentioned in #37672 (comment) we could do that in
setitem_with_indexer
if this is betterThere was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
In _setitem_with_indexer_split_path L 1686-1688 we have a no-op block that is for all-false boolean masks. could move it up to before the 2D check. would that do the trick?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
One possible solution is moving up the
lplane_indexer==0
condition and removing the value part. Probably the shortest and does not seem to break tests. Don't know if this kills behavior not tested, but if indexer has len=0, we probably do not want to set values anyway