我有一个数据框,col像这样:
NaN
859.0
NaN
NaN
0.0
NaN
我想通过先前的非NaN值更改零,而不要更改其他NaN,请获取此信息:
NaN
859.0
NaN
NaN
859.0
NaN
我尝试用ffill替换,但无法获得正确的输出。
欢迎帮助!
答案 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