在 pandas 中,如何在没有 for 循环的情况下用不超过 4 行的最后一个非零值替换所有零值?
In pandas, how to replace all zero values with the last non zero value which is not more than 4 rows up, without a for loop?
如果我的数据框列之一如下所示:
5
0
0
0
0
0
6
0
它应该是这样的
5
5
5
5
5
0
6
6
我知道如何使用循环和计数器来实现,但我想知道如何在没有 for 循环的情况下实现?
如果值为 0,您可以 mask
获取 nan,使用 ffill
和 limit 参数,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
你甚至不需要屏蔽,有方法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
如果我的数据框列之一如下所示:
5
0
0
0
0
0
6
0
它应该是这样的
5
5
5
5
5
0
6
6
我知道如何使用循环和计数器来实现,但我想知道如何在没有 for 循环的情况下实现?
如果值为 0,您可以 mask
获取 nan,使用 ffill
和 limit 参数,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
你甚至不需要屏蔽,有方法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