Skip to content

Commit d527b88

Browse files
authored
REF: share check_value_size (pandas-dev#40009)
1 parent bc22229 commit d527b88

File tree

4 files changed

+26
-32
lines changed

4 files changed

+26
-32
lines changed

pandas/core/arrays/_mixins.py

+1-10
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,6 @@
2323
from pandas.util._validators import validate_fillna_kwargs
2424

2525
from pandas.core.dtypes.common import is_dtype_equal
26-
from pandas.core.dtypes.inference import is_array_like
2726
from pandas.core.dtypes.missing import array_equivalent
2827

2928
from pandas.core import missing
@@ -275,15 +274,7 @@ def fillna(
275274
value, method = validate_fillna_kwargs(value, method)
276275

277276
mask = self.isna()
278-
279-
# TODO: share this with EA base class implementation
280-
if is_array_like(value):
281-
if len(value) != len(self):
282-
raise ValueError(
283-
f"Length of 'value' does not match. Got ({len(value)}) "
284-
f" expected {len(self)}"
285-
)
286-
value = value[mask]
277+
value = missing.check_value_size(value, mask, len(self))
287278

288279
if mask.any():
289280
if method is not None:

pandas/core/arrays/base.py

+6-12
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,6 @@
4444

4545
from pandas.core.dtypes.cast import maybe_cast_to_extension_array
4646
from pandas.core.dtypes.common import (
47-
is_array_like,
4847
is_dtype_equal,
4948
is_list_like,
5049
is_scalar,
@@ -58,13 +57,15 @@
5857
)
5958
from pandas.core.dtypes.missing import isna
6059

61-
from pandas.core import ops
60+
from pandas.core import (
61+
missing,
62+
ops,
63+
)
6264
from pandas.core.algorithms import (
6365
factorize_array,
6466
isin,
6567
unique,
6668
)
67-
from pandas.core.missing import get_fill_func
6869
from pandas.core.sorting import (
6970
nargminmax,
7071
nargsort,
@@ -696,18 +697,11 @@ def fillna(self, value=None, method=None, limit=None):
696697
value, method = validate_fillna_kwargs(value, method)
697698

698699
mask = self.isna()
699-
700-
if is_array_like(value):
701-
if len(value) != len(self):
702-
raise ValueError(
703-
f"Length of 'value' does not match. Got ({len(value)}) "
704-
f"expected {len(self)}"
705-
)
706-
value = value[mask]
700+
value = missing.check_value_size(value, mask, len(self))
707701

708702
if mask.any():
709703
if method is not None:
710-
func = get_fill_func(method)
704+
func = missing.get_fill_func(method)
711705
new_values = func(self.astype(object), limit=limit, mask=mask)
712706
new_values = self._from_sequence(new_values, dtype=self.dtype)
713707
else:

pandas/core/arrays/string_arrow.py

+3-10
Original file line numberDiff line numberDiff line change
@@ -33,13 +33,13 @@
3333
is_integer_dtype,
3434
is_scalar,
3535
)
36+
from pandas.core import missing
3637
from pandas.core.arraylike import OpsMixin
3738
from pandas.core.arrays.base import ExtensionArray
3839
from pandas.core.indexers import (
3940
check_array_indexer,
4041
validate_indices,
4142
)
42-
from pandas.core.missing import get_fill_func
4343

4444
try:
4545
import pyarrow as pa
@@ -380,18 +380,11 @@ def fillna(self, value=None, method=None, limit=None):
380380
value, method = validate_fillna_kwargs(value, method)
381381

382382
mask = self.isna()
383-
384-
if is_array_like(value):
385-
if len(value) != len(self):
386-
raise ValueError(
387-
f"Length of 'value' does not match. Got ({len(value)}) "
388-
f"expected {len(self)}"
389-
)
390-
value = value[mask]
383+
value = missing.check_value_size(value, mask, len(self))
391384

392385
if mask.any():
393386
if method is not None:
394-
func = get_fill_func(method)
387+
func = missing.get_fill_func(method)
395388
new_values = func(self.to_numpy(object), limit=limit, mask=mask)
396389
new_values = self._from_sequence(new_values)
397390
else:

pandas/core/missing.py

+16
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
from pandas.core.dtypes.cast import infer_dtype_from
3030
from pandas.core.dtypes.common import (
3131
ensure_float64,
32+
is_array_like,
3233
is_integer_dtype,
3334
is_numeric_v_string_like,
3435
needs_i8_conversion,
@@ -39,6 +40,21 @@
3940
from pandas import Index
4041

4142

43+
def check_value_size(value, mask: np.ndarray, length: int):
44+
"""
45+
Validate the size of the values passed to ExtensionArray.fillna.
46+
"""
47+
if is_array_like(value):
48+
if len(value) != length:
49+
raise ValueError(
50+
f"Length of 'value' does not match. Got ({len(value)}) "
51+
f" expected {length}"
52+
)
53+
value = value[mask]
54+
55+
return value
56+
57+
4258
def mask_missing(arr: ArrayLike, values_to_mask) -> np.ndarray:
4359
"""
4460
Return a masking array of same size/shape as arr

0 commit comments

Comments
 (0)