Python 计算行之间的线性/多项式值

Python 计算行之间的线性/多项式值,python,pandas,Python,Pandas,我正在做一个价格表,我正试图找到一种方法,根据不同的列计算线性或多项式。这是我的数据集,我将解释我试图做什么: lf seed 2468 5685.05300 0.0 2469 NaN 0.0 2470 NaN 0.0 2471 NaN 0.0 2472 NaN 0.0 2473 NaN 0.0 2474 NaN 0.0 2475

我正在做一个价格表,我正试图找到一种方法,根据不同的列计算线性或多项式。这是我的数据集,我将解释我试图做什么:

              lf  seed
2468  5685.05300   0.0
2469         NaN   0.0
2470         NaN   0.0
2471         NaN   0.0
2472         NaN   0.0
2473         NaN   0.0
2474         NaN   0.0
2475         NaN   0.0
2476  5680.89225   0.0
2477         NaN   0.0
2478         NaN   0.0
2479         NaN   0.0
2480         NaN   0.0
2481  5687.35365   0.0
2482         NaN   0.0
2483         NaN   0.0
2484         NaN   0.0
2485         NaN   0.0
2486  5685.15090   0.0
2487         NaN   0.0
2488         NaN   0.0
2489         NaN   0.0
2490         NaN   0.0
2491  5685.10195   0.0
2492         NaN   0.0
2493         NaN   0.0
2494         NaN   0.0
2495         NaN   0.0
2496         NaN   0.0
2497         NaN   0.0
2498  5659.50110   0.0
2499         NaN   0.0
2500         NaN   0.0
2501         NaN   0.0
2502  5653.96975   0.0
2503         NaN   0.0
2504         NaN   0.0
2505         NaN   0.0
例如:我想计算索引
2468
2476
之间的差异,即
4.16075
,在这种特殊情况下,将其除以
8
,并通过减去计算值填充种子列,因为下一个值低于上一个值。顺便说一句,由于在最后3行中没有设置值,我需要继续最后几点。我的意思是:

2498  5659.50110   0.0
2499         NaN   0.0
2500         NaN   0.0
2501         NaN   0.0
2502  5653.96975   0.0
2503         NaN   0.0
2504         NaN   0.0
2505         NaN   0.0
seed
应继续,直到在
lf

有没有一种切实可行的方法,或者我必须创建一个循环函数才能做到这一点

编辑:预期输出

              lf         seed
2476  5680.89225  5680.892250
2477         NaN  5682.184530
2478         NaN  5683.476810
2479         NaN  5684.769090
2480         NaN  5686.061370
2481  5687.35365  5687.353650
2482         NaN  5686.913100
2483         NaN  5686.472550
2484         NaN  5686.032000
2485         NaN  5685.591450
2486  5685.15090  5685.150900
2487         NaN  5685.141110
2488         NaN  5685.131320
2489         NaN  5685.121530
2490         NaN  5685.111740
2491  5685.10195  5685.101950
2492         NaN  5681.444686
2493         NaN  5677.787421
2494         NaN  5674.130157
2495         NaN  5670.472893
2496         NaN  5666.815629
2497         NaN  5663.158364
2498  5659.50110  5659.501100
2499         NaN  5658.118262
2500         NaN  5656.735425
2501         NaN  5655.352587
2502  5653.96975  5653.969750
2503         NaN  5652.586912
2504         NaN  5651.204075
2505         NaN  5649.821237

除了最后一个值以外的行之外,其他所有内容都是无关紧要的:它只是

df["inside"] = df.lf.interpolate("linear", limit_area="inside")
为了在最后处理外推,我们可以向前填充插值之间的差异,然后获取累积和以返回原始值:

delta = df.lf.interpolate("linear", limit_area="inside").diff().ffill()
df["rebuilt"] = delta.fillna(df.lf).cumsum()
这让我

              lf         seed       inside      rebuilt
2476  5680.89225  5680.892250  5680.892250  5680.892250
2477         NaN  5682.184530  5682.184530  5682.184530
2478         NaN  5683.476810  5683.476810  5683.476810
2479         NaN  5684.769090  5684.769090  5684.769090
2480         NaN  5686.061370  5686.061370  5686.061370
2481  5687.35365  5687.353650  5687.353650  5687.353650
2482         NaN  5686.913100  5686.913100  5686.913100
2483         NaN  5686.472550  5686.472550  5686.472550
2484         NaN  5686.032000  5686.032000  5686.032000
2485         NaN  5685.591450  5685.591450  5685.591450
2486  5685.15090  5685.150900  5685.150900  5685.150900
2487         NaN  5685.141110  5685.141110  5685.141110
2488         NaN  5685.131320  5685.131320  5685.131320
2489         NaN  5685.121530  5685.121530  5685.121530
2490         NaN  5685.111740  5685.111740  5685.111740
2491  5685.10195  5685.101950  5685.101950  5685.101950
2492         NaN  5681.444686  5681.444686  5681.444686
2493         NaN  5677.787421  5677.787421  5677.787421
2494         NaN  5674.130157  5674.130157  5674.130157
2495         NaN  5670.472893  5670.472893  5670.472893
2496         NaN  5666.815629  5666.815629  5666.815629
2497         NaN  5663.158364  5663.158364  5663.158364
2498  5659.50110  5659.501100  5659.501100  5659.501100
2499         NaN  5658.118262  5658.118263  5658.118263
2500         NaN  5656.735425  5656.735425  5656.735425
2501         NaN  5655.352587  5655.352588  5655.352588
2502  5653.96975  5653.969750  5653.969750  5653.969750
2503         NaN  5652.586912          NaN  5652.586912
2504         NaN  5651.204075          NaN  5651.204075
2505         NaN  5649.821237          NaN  5649.821237


注意:我假设序列顶部没有任何NaN值。如果需要的话,我们也可以处理这些问题。

这是一个很好的解决方案。唯一的问题是“重建”在这里不起作用?最后3行是5653.969750df.lf.interpolate(“linear”,limit_area=“inside”),此代码使用my中的最后一个值填充NaN值side@DonCoder:您使用的是旧版本的熊猫吗?如果我使用过时的版本,我可以重现你的问题。我使用的是0.22.0。我已经更新了pandas,现在它工作得很好!非常感谢你。
In [126]: np.allclose(df["rebuilt"], df["seed"])
Out[126]: True