在熊猫中如何用最接近的非南值替换零值?

时间:2019-11-30 16:48:44

标签: python pandas

我有一个数据框,col像这样:

NaN
859.0
NaN
NaN
0.0
NaN

我想通过先前的非NaN值更改零,而不要更改其他NaN,请获取此信息:

NaN
859.0
NaN
NaN
859.0
NaN

我尝试用ffill替换,但无法获得正确的输出。

欢迎帮助!

3 个答案:

答案 0 :(得分:1)

.ffill().shift()将向前传播最后一个非空值,然后您可以为其分配任何值为0的行:

In [42]: s.ffill().shift()
Out[42]:
0      NaN
1      NaN
2    859.0
3    859.0
4    859.0
5      0.0
dtype: float64

In [43]: s[s==0] = s.ffill().shift()

In [44]: s
Out[44]:
0      NaN
1    859.0
2      NaN
3      NaN
4    859.0
5      NaN
dtype: float64

答案 1 :(得分:1)

首先将0替换为缺失值,使用ffill向前填充缺失值,最后将缺失值替换为Series.mask

df['col'] = df['col'].mask(df['col'].eq(0)).ffill().mask(df['col'].isna())
print (df)
     col
0    NaN
1  859.0
2    NaN
3    NaN
4  859.0
5    NaN

答案 2 :(得分:0)

您也可以使用last_valid_index进行此操作:

假设您的列位于df['col']

for i,_ in df.iterrows():
    if df.loc[i,'col'] == 0:
        df.at[i,'col'] = df.loc[df.loc[:i-1,'col'].last_valid_index(),'col']

输出:

     col
0    NaN
1  859.0
2    NaN
3    NaN
4  859.0
5    NaN