pandas 如何使用panda.DataFrame.interpolate对第一个和最后一个值进行插值?

icomxhvb  于 2023-02-28  发布在  其他
关注(0)|答案(1)|浏览(154)

我知道以前有人问过这个问题,但我发现建议的解决办法对我不起作用,也许我试图做一些根本不可能做的事情,但让我解释一下。
我有一个时间序列data,它的一些值为0,我想用pandas.DataFrame.interpolate来插入data中的零。
代码:

import pandas as pd
import numpy as np

data = [0, -1.31527, -2.25448, -0.965348, -1.11168, -0.0506046, -0.605522,
        2.01337, 0, 0, 2.41931, 0.821425, 0.402411, 0]

df = pd.DataFrame(data=data) # Data to pandas dataframe
df.replace(to_replace=0, value=np.nan, inplace=True) # Replace 0 by nan
ip = df.interpolate(method="nearest", order=3, limit=None,
                    limit_direction=None)
print(ip)

print(ip)的结果:

0
0        NaN
1  -1.315270
2  -2.254480
3  -0.965348
4  -1.111680
5  -0.050605
6  -0.605522
7   2.013370
8   2.013370
9   2.419310
10  2.419310
11  0.821425
12  0.402411
13       NaN
    • 问题:**Pandas不会插入data的第一个和最后一个值,而是将它们保留为零。我尝试了pandas.DataFrame.interpolate的所有选项,但似乎无法插入data的第一个和最后一个零。这是通过Pandas根本不可能实现的,还是我做错了什么?
vwoqyblh

vwoqyblh1#

你想要的是一个外推,你需要决定如何做。
您可以ffill/bfill

ip = (df.interpolate(method="nearest", order=3, limit=None,
                     limit_direction='both')
        .ffill().bfill()
     )

输出:

0
0  -1.315270
1  -1.315270
2  -2.254480
3  -0.965348
4  -1.111680
5  -0.050605
6  -0.605522
7   2.013370
8   2.013370
9   2.419310
10  2.419310
11  0.821425
12  0.402411
13  0.402411

或者使用样条曲线:

ip = (df.interpolate(method="nearest", order=3, limit=None,
                     limit_direction=None)
        .fillna(
      df.interpolate(method="spline", order=3, limit=None,
                     limit_direction='both')
        )
     )

输出:

0
0  -0.585237
1  -1.315270
2  -2.254480
3  -0.965348
4  -1.111680
5  -0.050605
6  -0.605522
7   2.013370
8   2.013370
9   2.419310
10  2.419310
11  0.821425
12  0.402411
13 -1.951716

输出:

相关问题