-
-
Notifications
You must be signed in to change notification settings - Fork 18.5k
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 11 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.
any way to avoid the np.array call? i think that makes a copy if we have eg a list
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.
I don't think so,
is_empty_indexer
requires an ndarray, while value may be a list.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.
the test is for
loc.__setitem__
. is that (or i guessiloc.__setitem__
) the only way we can get here? it may make sense to do this in setitem_with_indexerThere 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.
Yeah, that would be possible I think.
Sport would be in
pandas/pandas/core/indexing.py
Line 1567 in 524fc9c
Ran the tests in indexing, frame/indexing and series/indexing locally, this seems to work. Let me know, if we should move this
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.
you can use np.asarray, also can we check len of the indexer here first to short-cut?
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.
Thx used asarray. Indexer is a tuple containing an empty list, len does not work here unfortunately.