Skip to content

Commit c98667c

Browse files
committed
cross type arithmetic
1 parent 9b0ccea commit c98667c

File tree

2 files changed

+26
-2
lines changed

2 files changed

+26
-2
lines changed

pandas/core/arrays/integer.py

+7-2
Original file line numberDiff line numberDiff line change
@@ -112,6 +112,7 @@ def coerce_to_array(values, dtype, mask=None, copy=False):
112112
'mixed-integer', 'mixed-integer-float']:
113113
raise TypeError("{} cannot be converted to an IntegerDtype".format(
114114
values.dtype))
115+
115116
elif not (is_integer_dtype(values) or is_float_dtype(values)):
116117
raise TypeError("{} cannot be converted to an IntegerDtype".format(
117118
values.dtype))
@@ -126,15 +127,19 @@ def coerce_to_array(values, dtype, mask=None, copy=False):
126127
if not mask.ndim == 1:
127128
raise TypeError("mask must be a 1D list-like")
128129

130+
# avoid float->int numpy conversion issues
131+
if is_object_dtype(values):
132+
mask |= isna(values)
133+
134+
# we copy as need to coerce here
129135
if mask.any():
130-
# we copy as need to coerce here
131136
values = values.copy()
132137
values[mask] = 1
133138

134139
values = values.astype(dtype.type)
135-
136140
else:
137141
values = values.astype(dtype.type, copy=False)
142+
138143
return values, mask
139144

140145

pandas/tests/extension/integer/test_integer.py

+19
Original file line numberDiff line numberDiff line change
@@ -393,3 +393,22 @@ def test_to_integer_array(values, expected):
393393
# convert existing arrays to IntegerArrays
394394
result = to_integer_array(values)
395395
tm.assert_extension_array_equal(result, expected)
396+
397+
398+
def test_cross_type_arithmetic():
399+
400+
df = pd.DataFrame({'A': pd.Series([1, 2, np.nan], dtype='Int64'),
401+
'B': pd.Series([1, np.nan, 3], dtype='UInt8'),
402+
'C': [1, 2, 3]})
403+
404+
result = df.A + df.C
405+
expected = pd.Series([2, 4, np.nan], dtype='Int64')
406+
tm.assert_series_equal(result, expected)
407+
408+
result = (df.A + df.C) * 3 == 12
409+
expected = pd.Series([False, True, False])
410+
tm.assert_series_equal(result, expected)
411+
412+
result = df.A + df.B
413+
expected = pd.Series([2, np.nan, np.nan], dtype='Int64')
414+
tm.assert_series_equal(result, expected)

0 commit comments

Comments
 (0)