В pandas, как заменить все нулевые значения последним ненулевым значением, которое находится не более чем на 4 строки вверх, без для l oop? - PullRequest
2 голосов
/ 05 августа 2020

Если один из моих столбцов фрейма данных выглядит так:

5
0
0
0
0
0
6
0

Он должен выглядеть так

5
5
5
5
5
0
6
6

Я знаю, как это сделать с помощью al oop и счетчика , а мне интересно, как это сделать без l oop?

Ответы [ 2 ]

3 голосов
/ 05 августа 2020

Маскировать даже не нужно, есть метод replace, который позволяет указать limit и method='ffill'. Прохождение Nan также преобразуется в число с плавающей запятой, которое не требуется.

import pandas as pd

df = pd.DataFrame({'a': [5, 0, 0, 0, 0, 0, 6, 0]})

# Replace 0s with forward fill and limit set to 4 elements
df2 = df.replace(0, limit=4, method='ffill')

print(df)

   a
0  5
1  5
2  5
3  5
4  5
5  0
6  6
7  6

3 голосов
/ 05 августа 2020

вы можете mask, если значение равно 0, чтобы получить nan, используйте ffill с параметром ограничения и fillna остальное с 0

s = pd.Series([5,0,0,0,0,0,6,0])
s_ = s.mask(s.eq(0)).ffill(limit=4).fillna(0)
print (s_)
0    5.0
1    5.0
2    5.0
3    5.0
4    5.0
5    0.0
6    6.0
7    6.0
dtype: float64
...