Skip to content

Commit 84376e9

Browse files
committed
BUG: fix bool no-op replace calls
1 parent 5c9a2fd commit 84376e9

File tree

3 files changed

+43
-2
lines changed

3 files changed

+43
-2
lines changed

pandas/core/common.py

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -347,7 +347,13 @@ def mask_missing(arr, values_to_mask):
347347
values_to_mask = [values_to_mask]
348348

349349
try:
350-
values_to_mask = np.array(values_to_mask, dtype=arr.dtype)
350+
values = np.array(values_to_mask)
351+
cant_cast = not np.can_cast(values.dtype, arr.dtype, casting='safe')
352+
353+
if cant_cast and arr.dtype == np.bool_:
354+
values_to_mask = values
355+
else:
356+
values_to_mask = np.array(values_to_mask, dtype=arr.dtype)
351357
except Exception:
352358
values_to_mask = np.array(values_to_mask, dtype=object)
353359

pandas/tests/test_frame.py

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7975,7 +7975,7 @@ def test_replace_dict_tuple_list_ordering_remains_the_same(self):
79757975
tm.assert_frame_equal(res2, res3)
79767976
tm.assert_frame_equal(res3, expected)
79777977

7978-
def test_replace_doesnt_replace_with_no_regex(self):
7978+
def test_replace_doesnt_replace_without_regex(self):
79797979
from pandas.compat import StringIO
79807980
raw = """fol T_opp T_Dir T_Enh
79817981
0 1 0 0 vo
@@ -7986,6 +7986,23 @@ def test_replace_doesnt_replace_with_no_regex(self):
79867986
res = df.replace({'\D': 1})
79877987
tm.assert_frame_equal(df, res)
79887988

7989+
def test_replace_bool_with_string(self):
7990+
df = DataFrame({'a': [True, False], 'b': list('ab')})
7991+
result = df.replace(True, 'a')
7992+
expected = DataFrame({'a': ['a', False], 'b': df.b})
7993+
tm.assert_frame_equal(result, expected)
7994+
7995+
def test_replace_pure_bool_with_string_no_op(self):
7996+
df = DataFrame(np.random.rand(2, 2) > 0.5)
7997+
result = df.replace('asdf', 'fdsa')
7998+
tm.assert_frame_equal(df, result)
7999+
8000+
def test_replace_bool_with_bool(self):
8001+
df = DataFrame(np.random.rand(2, 2) > 0.5)
8002+
result = df.replace(False, True)
8003+
expected = DataFrame(np.ones((2, 2), dtype=bool))
8004+
tm.assert_frame_equal(result, expected)
8005+
79898006
def test_combine_multiple_frames_dtypes(self):
79908007
from pandas import concat
79918008

pandas/tests/test_series.py

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5349,6 +5349,24 @@ def check_replace(to_rep, val, expected):
53495349
assert_series_equal(r, Series([1.0,2,'a'] +
53505350
dr[3:].tolist(),dtype=object))
53515351

5352+
def test_replace_bool_with_string_no_op(self):
5353+
s = Series([True, False, True])
5354+
result = s.replace('fun', 'in-the-sun')
5355+
tm.assert_series_equal(s, result)
5356+
5357+
def test_replace_bool_with_string(self):
5358+
# nonexistent elements
5359+
s = Series([True, False, True])
5360+
result = s.replace(True, '2u')
5361+
expected = Series(['2u', False, '2u'])
5362+
tm.assert_series_equal(expected, result)
5363+
5364+
def test_replace_bool_with_bool(self):
5365+
s = Series([True, False, True])
5366+
result = s.replace(True, False)
5367+
expected = Series([False] * len(s))
5368+
tm.assert_series_equal(expected, result)
5369+
53525370
def test_asfreq(self):
53535371
ts = Series([0., 1., 2.], index=[datetime(2009, 10, 30),
53545372
datetime(2009, 11, 30),

0 commit comments

Comments
 (0)