@@ -251,51 +251,35 @@ def fillna(self, value=None, method=None, limit=None):
251
251
"""
252
252
from pandas .api .types import is_scalar
253
253
from pandas .util ._validators import validate_fillna_kwargs
254
+ from pandas .core .missing import pad_1d , backfill_1d
254
255
255
256
value , method = validate_fillna_kwargs (value , method )
256
257
258
+ mask = self .isna ()
259
+
257
260
if not is_scalar (value ):
258
261
if len (value ) != len (self ):
259
262
raise ValueError ("Length of 'value' does not match. Got ({}) "
260
263
" expected {}" .format (len (value ), len (self )))
261
- else :
262
- value = itertools .cycle ([value ])
264
+ value = value [mask ]
263
265
264
266
if limit is not None :
265
267
msg = ("Specifying 'limit' for 'fillna' has not been implemented "
266
268
"yet for {} typed data" .format (self .dtype ))
267
269
raise NotImplementedError (msg )
268
270
269
- mask = self .isna ()
270
-
271
271
if mask .any ():
272
272
# 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 )
293
279
else :
294
280
# 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
299
283
else :
300
284
new_values = self
301
285
return type (self )(new_values )
0 commit comments