首页 > 解决方案 > 唯一值之间的线性插值 - Python

问题描述

我有一个 df 在重复的时间点包含多个值。我想插入两个特定列的值,但仅限于唯一时间点之间。使用下面的 df,我想插值X并且Y仅在唯一时间点之间。

import pandas as pd
import numpy as np

df = pd.DataFrame({       
        'Time' : ['09:00:00.1','09:00:00.1','09:00:00.2','09:00:00.2','09:00:00.3'],       
        'X' : [1,np.nan,np.nan,np.nan,3],
        'Y' : [1,np.nan,np.nan,np.nan,3],
        'A' : [5,np.nan,np.nan,np.nan,6],
        'B' : [5,np.nan,np.nan,np.nan,6],                           
        })  

df1 = df.groupby('Time').apply(lambda x: x.interpolate(method='linear'))

注意:我不想要,

df[['X','Y']] = df[['X','Y']].interpolate(method = 'linear')

预期的输出是:

        Time    X    Y    A    B
0  09:00:00.1  1.0  1.0  5.0  5.0
1  09:00:00.1  1.0  1.0  Nan  NaN
2  09:00:00.2  2.0  2.0  NaN  NaN
3  09:00:00.2  2.0  2.0  NaN  NaN
4  09:00:00.3  3.0  3.0  6.0  6.0

标签: pythonpandasinterpolation

解决方案


首先,我们drop_duplicates基于Time获取唯一行,然后使用这些值进行插值并更新原始数据框。

最后,我们使用ffill转发填充我们的值:

interpolation = df.drop_duplicates('Time')[['X', 'Y']].interpolate()
df.loc[interpolation.index, ['X', 'Y']] = interpolation
df.loc[:, ['X', 'Y']] = df[['X', 'Y']].ffill()
         Time    X    Y    A    B
0  09:00:00.1 1.00 1.00 5.00 5.00
1  09:00:00.1 1.00 1.00  nan  nan
2  09:00:00.2 2.00 2.00  nan  nan
3  09:00:00.2 2.00 2.00  nan  nan
4  09:00:00.3 3.00 3.00 6.00 6.00

另一种方法是使用np.floor,但这在您具有示例数据框中的场景时才有效(并且可能不是这种情况):

df[['X', 'Y']] = np.floor(df[['X', 'Y']].interpolate())
         Time    X    Y    A    B
0  09:00:00.1 1.00 1.00 5.00 5.00
1  09:00:00.1 1.00 1.00  nan  nan
2  09:00:00.2 2.00 2.00  nan  nan
3  09:00:00.2 2.00 2.00  nan  nan
4  09:00:00.3 3.00 3.00 6.00 6.00

推荐阅读