def fillna(self: BaseMaskedArrayT, value=None, method=None, limit=None) -> BaseMaskedArrayT: value, method = validate_fillna_kwargs(value, method) mask = self._mask if is_array_like(value): if len(value) != len(self): raise ValueError( f"Length of 'value' does not match. Got ({len(value)}) " f" expected {len(self)}") value = value[mask] if mask.any(): if method is not None: func = missing.get_fill_func(method) new_values, new_mask = func( self._data.copy(), limit=limit, mask=mask.copy(), ) return type(self)(new_values, new_mask.view(np.bool_)) else: # fill with value new_values = self.copy() new_values[mask] = value else: new_values = self.copy() return new_values
def fillna(self, value=None, method=None, limit=None): from pandas.api.types import is_array_like from pandas.core.missing import get_fill_func from pandas.util._validators import validate_fillna_kwargs value, method = validate_fillna_kwargs(value, method) mask = self.isna() if is_array_like(value): if len(value) != len(self): raise ValueError("Length of 'value' does not match. Got ({}) " " expected {}".format(len(value), len(self))) value = value[mask] if mask.any(): if method is not None: func = get_fill_func(method) new_values = func(self.astype(object), limit=limit, mask=mask) new_values = self._from_sequence(new_values, self._dtype) else: # fill with value new_values = np.asarray(self) if isinstance(value, Geometry): value = [value] new_values[mask] = value new_values = self.__class__(new_values, dtype=self.dtype) else: new_values = self.copy() return new_values
def fillna(self, value=None, method=None, limit=None): # TODO(#20300) # To avoid converting to object, we re-implement here with the changes # 1. Passing `_data` to func instead of self.astype(object) # 2. Re-boxing output of 1. # #20300 should let us do this kind of logic on ExtensionArray.fillna # and we can use it. if isinstance(value, ABCSeries): value = value._values value, method = validate_fillna_kwargs(value, method) mask = self.isna() if is_array_like(value): if len(value) != len(self): raise ValueError("Length of 'value' does not match. Got ({}) " " expected {}".format(len(value), len(self))) value = value[mask] if mask.any(): if method is not None: func = pad_1d if method == 'pad' else backfill_1d new_values = func(self._data, limit=limit, mask=mask) new_values = type(self)(new_values, freq=self.freq) else: # fill with value new_values = self.copy() new_values[mask] = value else: new_values = self.copy() return new_values
def fillna(self: NDArrayBackedExtensionArrayT, value=None, method=None, limit=None) -> NDArrayBackedExtensionArrayT: value, method = validate_fillna_kwargs(value, method) mask = self.isna() # TODO: share this with EA base class implementation if is_array_like(value): if len(value) != len(self): raise ValueError( f"Length of 'value' does not match. Got ({len(value)}) " f" expected {len(self)}") value = value[mask] if mask.any(): if method is not None: func = missing.get_fill_func(method) new_values = func(self._ndarray.copy(), limit=limit, mask=mask) # TODO: PandasArray didn't used to copy, need tests for this new_values = self._from_backing_data(new_values) else: # fill with value new_values = self.copy() new_values[mask] = value else: new_values = self.copy() return new_values
def fillna(self, value=None, method=None, limit=None): # TODO(_values_for_fillna): remove this value, method = validate_fillna_kwargs(value, method) mask = self.isna() if is_array_like(value): if len(value) != len(self): raise ValueError("Length of 'value' does not match. Got ({}) " " expected {}".format(len(value), len(self))) value = value[mask] if mask.any(): if method is not None: func = pad_1d if method == 'pad' else backfill_1d new_values = func(self._ndarray, limit=limit, mask=mask) new_values = self._from_sequence(new_values, dtype=self.dtype) else: # fill with value new_values = self.copy() new_values[mask] = value else: new_values = self.copy() return new_values
def fillna(self, value=None, method=None, limit=None): # Override in RaggedArray to handle ndarray fill values from pandas.util._validators import validate_fillna_kwargs from pandas.core.missing import pad_1d, backfill_1d value, method = validate_fillna_kwargs(value, method) mask = self.isna() if isinstance(value, RaggedArray): if len(value) != len(self): raise ValueError("Length of 'value' does not match. Got ({}) " " expected {}".format(len(value), len(self))) value = value[mask] if mask.any(): if method is not None: func = pad_1d if method == 'pad' else backfill_1d new_values = func(self.astype(object), limit=limit, mask=mask) new_values = self._from_sequence(new_values, dtype=self.dtype) else: # fill with value new_values = list(self) mask_indices, = np.where(mask) for ind in mask_indices: new_values[ind] = value new_values = self._from_sequence(new_values, dtype=self.dtype) else: new_values = self.copy() return new_values
def fillna( self: NDArrayBackedExtensionArrayT, value=None, method=None, limit=None ) -> NDArrayBackedExtensionArrayT: value, method = validate_fillna_kwargs( value, method, validate_scalar_dict_value=False ) mask = self.isna() # error: Argument 2 to "check_value_size" has incompatible type # "ExtensionArray"; expected "ndarray" value = missing.check_value_size( value, mask, len(self) # type: ignore[arg-type] ) if mask.any(): if method is not None: # TODO: check value is None # (for now) when self.ndim == 2, we assume axis=0 func = missing.get_fill_func(method, ndim=self.ndim) new_values, _ = func(self._ndarray.T.copy(), limit=limit, mask=mask.T) new_values = new_values.T # TODO: PandasArray didn't used to copy, need tests for this new_values = self._from_backing_data(new_values) else: # fill with value new_values = self.copy() new_values[mask] = value else: # We validate the fill_value even if there is nothing to fill if value is not None: self._validate_setitem_value(value) new_values = self.copy() return new_values
def fillna(self, value=None, method=None, limit=None): # TODO(_values_for_fillna): remove this value, method = validate_fillna_kwargs(value, method) mask = self.isna() if is_array_like(value): if len(value) != len(self): raise ValueError( f"Length of 'value' does not match. Got ({len(value)}) " f" expected {len(self)}") value = value[mask] if mask.any(): if method is not None: func = pad_1d if method == "pad" else backfill_1d new_values = func(self._ndarray, limit=limit, mask=mask) new_values = self._from_sequence(new_values, dtype=self.dtype) else: # fill with value new_values = self.copy() new_values[mask] = value else: new_values = self.copy() return new_values
def fillna(self: NDArrayBackedExtensionArrayT, value=None, method=None, limit=None) -> NDArrayBackedExtensionArrayT: value, method = validate_fillna_kwargs(value, method) mask = self.isna() value = missing.check_value_size(value, mask, len(self)) if mask.any(): if method is not None: # TODO: check value is None # (for now) when self.ndim == 2, we assume axis=0 func = missing.get_fill_func(method, ndim=self.ndim) new_values, _ = func(self._ndarray.T.copy(), limit=limit, mask=mask.T) new_values = new_values.T # TODO: PandasArray didn't used to copy, need tests for this new_values = self._from_backing_data(new_values) else: # fill with value new_values = self.copy() new_values[mask] = value else: new_values = self.copy() return new_values
def fillna(self, value=None, method=None, limit=None): """ Fill NA/NaN values using the specified method. Parameters ---------- value : scalar, array-like If a scalar value is passed it is used to fill all missing values. Alternatively, an array-like 'value' can be given. It's expected that the array-like have the same length as 'self'. method : {'backfill', 'bfill', 'pad', 'ffill', None}, default None Method to use for filling holes in reindexed Series pad / ffill: propagate last valid observation forward to next valid backfill / bfill: use NEXT valid observation to fill gap limit : int, default None If method is specified, this is the maximum number of consecutive NaN values to forward/backward fill. In other words, if there is a gap with more than this number of consecutive NaNs, it will only be partially filled. If method is not specified, this is the maximum number of entries along the entire axis where NaNs will be filled. Returns ------- filled : ExtensionArray with NA/NaN filled """ from pandas.api.types import is_array_like from pandas.util._validators import validate_fillna_kwargs from pandas.core.missing import pad_1d, backfill_1d value, method = validate_fillna_kwargs(value, method) mask = self.isna() if is_array_like(value): if len(value) != len(self): raise ValueError( "Length of 'value' does not match. Got ({}) " " expected {}".format(len(value), len(self)) ) value = value[mask] if mask.any(): if method is not None: func = pad_1d if method == "pad" else backfill_1d new_values = func(self.astype(object), limit=limit, mask=mask) new_values = self._from_sequence(new_values, dtype=self.dtype) else: # fill with value new_values = self.copy() new_values[mask] = value else: new_values = self.copy() return new_values
def fillna(self, value=None, method=None, limit=None): """ Fill NA/NaN values using the specified method. Parameters ---------- value : scalar, array-like If a scalar value is passed it is used to fill all missing values. Alternatively, an array-like 'value' can be given. It's expected that the array-like have the same length as 'self'. method : {'backfill', 'bfill', 'pad', 'ffill', None}, default None Method to use for filling holes in reindexed Series pad / ffill: propagate last valid observation forward to next valid backfill / bfill: use NEXT valid observation to fill gap limit : int, default None If method is specified, this is the maximum number of consecutive NaN values to forward/backward fill. In other words, if there is a gap with more than this number of consecutive NaNs, it will only be partially filled. If method is not specified, this is the maximum number of entries along the entire axis where NaNs will be filled. Returns ------- filled : ExtensionArray with NA/NaN filled """ from pandas.api.types import is_array_like from pandas.util._validators import validate_fillna_kwargs from pandas.core.missing import pad_1d, backfill_1d value, method = validate_fillna_kwargs(value, method) mask = self.isna() if is_array_like(value): if len(value) != len(self): raise ValueError("Length of 'value' does not match. Got ({}) " " expected {}".format(len(value), len(self))) value = value[mask] if mask.any(): if method is not None: func = pad_1d if method == 'pad' else backfill_1d new_values = func(self.astype(object), limit=limit, mask=mask) new_values = self._from_sequence(new_values, dtype=self.dtype) else: # fill with value new_values = self.copy() new_values[mask] = value else: new_values = self.copy() return new_values
def fillna(self, value=None, method=None, limit=None): """ Fill NA/NaN values using the specified method. Parameters ---------- value : scalar, array-like If a scalar value is passed it is used to fill all missing values. Alternatively, an array-like 'value' can be given. It's expected that the array-like have the same length as 'self'. method : {'backfill', 'bfill', 'pad', 'ffill', None}, default None Method to use for filling holes in reindexed Series pad / ffill: propagate last valid observation forward to next valid backfill / bfill: use NEXT valid observation to fill gap. limit : int, default None If method is specified, this is the maximum number of consecutive NaN values to forward/backward fill. In other words, if there is a gap with more than this number of consecutive NaNs, it will only be partially filled. If method is not specified, this is the maximum number of entries along the entire axis where NaNs will be filled. Returns ------- ExtensionArray With NA/NaN filled. """ value, method = validate_fillna_kwargs(value, method) mask = self.isna() # error: Argument 2 to "check_value_size" has incompatible type # "ExtensionArray"; expected "ndarray" value = missing.check_value_size( value, mask, len(self) # type: ignore[arg-type] ) if mask.any(): if method is not None: func = missing.get_fill_func(method) new_values, _ = func(self.astype(object), limit=limit, mask=mask) new_values = self._from_sequence(new_values, dtype=self.dtype) else: # fill with value new_values = self.copy() new_values[mask] = value else: new_values = self.copy() return new_values
def fillna(self, value=None, method=None, limit=None): from pandas.util._validators import validate_fillna_kwargs value, method = validate_fillna_kwargs(value, method) mask = self.isna() from pandas.api.types import is_array_like, infer_dtype if is_array_like(value): if len(value) != len(self): raise ValueError( f"Length of 'value' does not match. Got ({len(value)}) " f"expected {len(self)}") value = value[mask] else: # because pandas infer_type(scalar) cant work on scalar value, we put the value into a list value = [value] if mask.any(): if method is not None: from pandas.core.missing import pad_1d from pandas.core.missing import backfill_1d func = pad_1d if method == "pad" else backfill_1d new_values = func(self.astype(object), limit=limit, mask=mask) new_values = self._from_sequence(new_values, dtype=self.dtype) # raise NotImplementedError("not support fillna with method") else: # translate value if not isinstance(getattr(value, "dtype", value), (GeoDtype, type(None))): inferred_type = infer_dtype(value, skipna=True) if inferred_type == "string": value = arctern.ST_GeomFromText(value) elif inferred_type == "bytes": pass else: raise ValueError( "can only fillna with wkt formed string or wkb formed bytes" ) # fill with value new_values = self.copy() new_values[mask] = value else: new_values = self.copy() return new_values
def fillna( self: NDArrayBackedExtensionArrayT, value=None, method=None, limit=None ) -> NDArrayBackedExtensionArrayT: value, method = validate_fillna_kwargs(value, method) mask = self.isna() value = missing.check_value_size(value, mask, len(self)) if mask.any(): if method is not None: func = missing.get_fill_func(method) new_values = func(self._ndarray.copy(), limit=limit, mask=mask) # TODO: PandasArray didn't used to copy, need tests for this new_values = self._from_backing_data(new_values) else: # fill with value new_values = self.copy() new_values[mask] = value else: new_values = self.copy() return new_values