Skip to content

Commit bff8193

Browse files
TomAugspurgerAndrew Bui
authored and
Andrew Bui
committed
BUG: ExtensionArray.fillna for scalar values (pandas-dev#20412)
Closes pandas-dev#20411
1 parent e7b87f7 commit bff8193

File tree

4 files changed

+38
-2
lines changed

4 files changed

+38
-2
lines changed

pandas/core/arrays/base.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -261,15 +261,15 @@ def fillna(self, value=None, method=None, limit=None):
261261
-------
262262
filled : ExtensionArray with NA/NaN filled
263263
"""
264-
from pandas.api.types import is_scalar
264+
from pandas.api.types import is_array_like
265265
from pandas.util._validators import validate_fillna_kwargs
266266
from pandas.core.missing import pad_1d, backfill_1d
267267

268268
value, method = validate_fillna_kwargs(value, method)
269269

270270
mask = self.isna()
271271

272-
if not is_scalar(value):
272+
if is_array_like(value):
273273
if len(value) != len(self):
274274
raise ValueError("Length of 'value' does not match. Got ({}) "
275275
" expected {}".format(len(value), len(self)))

pandas/tests/extension/base/base.py

+3
Original file line numberDiff line numberDiff line change
@@ -4,3 +4,6 @@
44
class BaseExtensionTests(object):
55
assert_series_equal = staticmethod(tm.assert_series_equal)
66
assert_frame_equal = staticmethod(tm.assert_frame_equal)
7+
assert_extension_array_equal = staticmethod(
8+
tm.assert_extension_array_equal
9+
)

pandas/tests/extension/base/missing.py

+6
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,12 @@ def test_dropna_frame(self, data_missing):
4747
expected = df.iloc[:0]
4848
self.assert_frame_equal(result, expected)
4949

50+
def test_fillna_scalar(self, data_missing):
51+
valid = data_missing[1]
52+
result = data_missing.fillna(valid)
53+
expected = data_missing.fillna(valid)
54+
self.assert_extension_array_equal(result, expected)
55+
5056
def test_fillna_limit_pad(self, data_missing):
5157
arr = data_missing.take([1, 0, 0, 0, 1])
5258
result = pd.Series(arr).fillna(method='ffill', limit=2)

pandas/util/testing.py

+27
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
import numpy as np
2121

2222
import pandas as pd
23+
from pandas.core.arrays import ExtensionArray
2324
from pandas.core.dtypes.missing import array_equivalent
2425
from pandas.core.dtypes.common import (
2526
is_datetimelike_v_numeric,
@@ -1083,6 +1084,32 @@ def _raise(left, right, err_msg):
10831084
return True
10841085

10851086

1087+
def assert_extension_array_equal(left, right):
1088+
"""Check that left and right ExtensionArrays are equal.
1089+
1090+
Parameters
1091+
----------
1092+
left, right : ExtensionArray
1093+
The two arrays to compare
1094+
1095+
Notes
1096+
-----
1097+
Missing values are checked separately from valid values.
1098+
A mask of missing values is computed for each and checked to match.
1099+
The remaining all-valid values are cast to object dtype and checked.
1100+
"""
1101+
assert isinstance(left, ExtensionArray)
1102+
assert left.dtype == right.dtype
1103+
left_na = left.isna()
1104+
right_na = right.isna()
1105+
assert_numpy_array_equal(left_na, right_na)
1106+
1107+
left_valid = left[~left_na].astype(object)
1108+
right_valid = right[~right_na].astype(object)
1109+
1110+
assert_numpy_array_equal(left_valid, right_valid)
1111+
1112+
10861113
# This could be refactored to use the NDFrame.equals method
10871114
def assert_series_equal(left, right, check_dtype=True,
10881115
check_index_type='equiv',

0 commit comments

Comments
 (0)