如何解决Pandas:在一系列可用值之前/之后估算给定数量的缺失值
假设我有一个时间序列,其中我通常拥有某个连续年份的可用数据,但在该跨度之前和之后缺少值,如下所示:
df = pd.DataFrame({'year': ["2000","2001","2002","2003","2004","2005","2006","2007"],'cakes eaten': [np.nan,np.nan,3,4,5,np.nan]})
print(df)
year cakes eaten
0 2000 NaN
1 2001 NaN
2 2002 NaN
3 2003 3.0
4 2004 4.0
5 2005 5.0
6 2006 NaN
7 2007 NaN
有没有办法根据可用值中看到的趋势来填充(给定数量的)缺失值?
假设我想在每个方向最多填充 2 个值,结果必须如下所示:
year cakes eaten
0 2000 NaN
1 2001 1.0
2 2002 2.0
3 2003 3.0
4 2004 4.0
5 2005 5.0
6 2006 6.0
7 2007 7.0
另外:有没有办法确保只有在有足够的可用值时才执行这种插补,例如,如果有,我只想在每个方向最多填充 2 个值至少有 3 个可用值(或更笼统地说,仅在 n + m 可用时才填充 n)?
解决方法
我会使用提到的 interpolate()。您可以使用多种方法来产生不同的结果。我使用 krogh
方法来获得线性趋势线。 limit_direction='both'
需要在两个方向上填充趋势:
test_dict = {'col': [np.nan,np.nan,4,5,6,np.nan]}
df = pd.DataFrame(test_dict)
df['trend'] = df['col'].interpolate(method='krogh',limit_direction='both')
col trend
0 NaN -1.0
1 NaN 0.0
2 NaN 1.0
3 NaN 2.0
4 NaN 3.0
5 4.0 4.0
6 5.0 5.0
7 6.0 6.0
8 NaN 7.0
完成后,您可以删除不需要的 below 0
趋势值。
感谢 @olv1do 向我展示了 interpolate() 做我想做的事。
使用 interpolate 和 jinja2.exceptions.UndefinedError: 'img_lst' is undefined
<img src=" {{url_for('static',filename=img_lst[0])}}">
和 .first_valid_index
允许实现所需的行为:
.last_valid_index
对于问题中的示例:
#impute n values in both directions if at least m values are available
def interpolate(data,n,m):
first_valid = data['cakes eaten'].first_valid_index()
last_valid = data['cakes eaten'].last_valid_index()
if(abs(first_valid - last_valid) + 1 >= m):
data['imputed'] = data['cakes eaten'].interpolate(method='spline',order = 1,limit_direction='both',limit = n)
return data
如果可用的值少于 m 个,则不执行任何操作:
df = pd.DataFrame({'year': ["2000","2001","2002","2003","2004","2005","2006","2007"],'cakes eaten': [np.nan,3,np.nan]})
interpolate(df,2,3)
year cakes eaten imputed
0 2000 NaN NaN
1 2001 NaN 1.0
2 2002 NaN 2.0
3 2003 3.0 3.0
4 2004 4.0 4.0
5 2005 5.0 5.0
6 2006 NaN 6.0
7 2007 NaN 7.0
此外,如果值不像我的示例那样完美线性,df = pd.DataFrame({'year': ["2000",3)
year cakes eaten
0 2000 NaN
1 2001 NaN
2 2002 NaN
3 2003 3.0
4 2004 4.0
5 2005 NaN
6 2006 NaN
7 2007 NaN
方法也能很好地工作:
spline
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。