Skip to content

Commit 67a19ba

Browse files
committed
REF: cast to object
1 parent 74614cb commit 67a19ba

File tree

1 file changed

+12
-28
lines changed

1 file changed

+12
-28
lines changed

pandas/core/arrays/base.py

+12-28
Original file line numberDiff line numberDiff line change
@@ -251,51 +251,35 @@ def fillna(self, value=None, method=None, limit=None):
251251
"""
252252
from pandas.api.types import is_scalar
253253
from pandas.util._validators import validate_fillna_kwargs
254+
from pandas.core.missing import pad_1d, backfill_1d
254255

255256
value, method = validate_fillna_kwargs(value, method)
256257

258+
mask = self.isna()
259+
257260
if not is_scalar(value):
258261
if len(value) != len(self):
259262
raise ValueError("Length of 'value' does not match. Got ({}) "
260263
" expected {}".format(len(value), len(self)))
261-
else:
262-
value = itertools.cycle([value])
264+
value = value[mask]
263265

264266
if limit is not None:
265267
msg = ("Specifying 'limit' for 'fillna' has not been implemented "
266268
"yet for {} typed data".format(self.dtype))
267269
raise NotImplementedError(msg)
268270

269-
mask = self.isna()
270-
271271
if mask.any():
272272
# ffill / bfill
273-
if method is not None:
274-
if method == 'backfill':
275-
data = reversed(self)
276-
mask = reversed(mask)
277-
last_valid = self[len(self) - 1]
278-
else:
279-
last_valid = self[0]
280-
data = self
281-
282-
new_values = []
283-
284-
for is_na, val in zip(mask, data):
285-
if is_na:
286-
new_values.append(last_valid)
287-
else:
288-
new_values.append(val)
289-
last_valid = val
290-
291-
if method in {'bfill', 'backfill'}:
292-
new_values = list(reversed(new_values))
273+
if method == 'pad':
274+
values = self.astype(object)
275+
new_values = pad_1d(values, mask=mask)
276+
elif method == 'backfill':
277+
values = self.astype(object)
278+
new_values = backfill_1d(values, mask=mask)
293279
else:
294280
# fill with value
295-
new_values = [
296-
val if is_na else original
297-
for is_na, original, val in zip(mask, self, value)
298-
]
281+
new_values = self.copy()
282+
new_values[mask] = value
299283
else:
300284
new_values = self
301285
return type(self)(new_values)

0 commit comments

Comments
 (0)