我有以下时间序列数据帧.我想用之前的值填充缺失的值.但是我只想填充缺失值,直到达到某个值.该值记录在不同的列中.所以我想要填充的列对于每一行都是不同的.我怎样才能做到这一点?
所以,给定这个数据帧.
import numpy as np
import pandas as pd
df = pd.DataFrame([[1, 2 ,np.nan,np.nan,np.nan , 2009], [1, 3 , np.nan , np.nan , np.nan , 2010], [4, np.nan , 7 , np.nan,np.nan , 2011]], columns=[2007,2008,2009,2010,2011 , fill_until])
输入数据帧
2007 2008 2009 2010 2011 fill_until
1 2 NaN NaN NaN 2009
1 3 NaN NaN NaN 2010
4 Nan 7 NaN NaN 2011
输出数据帧:
2007 2008 2009 2010 2011
1 2 2 NaN NaN
1 3 3 3 NaN
4 4 7 7 7
解决方法:
使用ffill在哪里 –
m = df.columns[:-1].values <= df.fill_until.values[:, None]
df.iloc[:, :-1].ffill(axis=1).where(m)
2007 2008 2009 2010 2011
0 1.0 2.0 2.0 NaN NaN
1 1.0 3.0 3.0 3.0 NaN
2 4.0 4.0 7.0 7.0 7.0
细节
使用NumPy的广播来获取基于fill_until列填充的值的掩码.
m = df.columns[:-1].values <= df.fill_until.values[:, None]
要么,
m = (df.columns[:-1].values[:, None] <= df.fill_until.values).T
m
array([[ True, True, True, False, False],
[ True, True, True, True, False],
[ True, True, True, True, True]], dtype=bool)
现在,切掉除最后一列之外的所有列,并沿第一轴调用ffill –
i = df.iloc[:, :-1].ffill(axis=1)
i
2007 2008 2009 2010 2011
0 1.0 2.0 2.0 2.0 2.0
1 1.0 3.0 3.0 3.0 3.0
2 4.0 4.0 7.0 7.0 7.0
现在,使用先前计算的掩码m来使用df.where屏蔽i的值 –
i.where(m)
2007 2008 2009 2010 2011
0 1.0 2.0 2.0 NaN NaN
1 1.0 3.0 3.0 3.0 NaN
2 4.0 4.0 7.0 7.0 7.0
或者,使用掩模,反转m –
i.mask(~m)
2007 2008 2009 2010 2011
0 1.0 2.0 2.0 NaN NaN
1 1.0 3.0 3.0 3.0 NaN
2 4.0 4.0 7.0 7.0 7.0
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。