微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

python – 填充空值直到Pandas中的某个列值

我有以下时间序列数据帧.我想用之前的值填充缺失的值.但是我只想填充缺失值,直到达到某个值.该值记录在不同的列中.所以我想要填充的列对于每一行都是不同的.我怎样才能做到这一点?

所以,给定这个数据帧.

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] 举报,一经查实,本站将立刻删除。

相关推荐