插值多索引熊猫数据框

Posted

技术标签:

【中文标题】插值多索引熊猫数据框【英文标题】:Interpolating multi index a pandas dataframe 【发布时间】:2019-05-21 03:39:05 【问题描述】:

我需要插入多索引数据帧:

例如:

这是主要的数据框:

a    b    c    result
1    1    1    6
1    1    2    9
1    2    1    8
1    2    2    11
2    1    1    7
2    1    2    10
2    2    1    9
2    2    2    12

我需要找到结果:

1.3    1.7    1.55    

到目前为止,我一直在做的是在里面添加一个 pd.Series 和 NaN 分别为每个索引。

如您所见。这似乎是一种非常低效的方式。

如果有人可以丰富我,我会很高兴。

附: 我花了一些时间查看 SO,如果答案在那里,我错过了:

Fill multi-index Pandas DataFrame with interpolation

Resampling Within a Pandas MultiIndex

pandas multiindex dataframe, ND interpolation for missing values

Fill multi-index Pandas DataFrame with interpolation

算法:

第一阶段:

a    b    c    result
1    1    1    6
1    1    2    9
1    2    1    8
1    2    2    11
1.3    1    1    6.3
1.3    1    2    9.3
1.3    2    1    8.3
1.3    2    2    11.3
2    1    1    7
2    1    2    10
2    2    1    9
2    2    2    12

第二阶段:

a    b    c    result
1    1    1    6
1    1    2    9
1    2    1    8
1    2    2    11
1.3    1    1    6.3
1.3    1    2    9.3
1.3    1.7    1    7.7
1.3    1.7    2    10.7
1.3    2    1    8.3
1.3    2    2    11.3
2    1    1    7
2    1    2    10
2    2    1    9
2    2    2    12

第三阶段:

a    b    c    result
1    1    1    6
1    1    2    9
1    2    1    8
1    2    2    11
1.3    1    1    6.3
1.3    1    2    9.3
1.3    1.7    1    7.7
1.3    1.7    1.55    9.35
1.3    1.7    2    10.7
1.3    2    1    8.3
1.3    2    2    11.3
2    1    1    7
2    1    2    10
2    2    1    9
2    2    2    12

【问题讨论】:

每个阶段是什么意思?你是什​​么意思需要找到'1.3 1.7 1.55'的结果? 我写下的阶段是我目前解决问题的方法。第 4 列是前三个列的实际值。把它想象成 4D 函数... f(x,y,z) = w 【参考方案1】:

您可以使用scipy.interpolate.LinearNDInterpolator 做您想做的事。如果数据框是具有“a”、“b”和“c”列的 MultiIndex,则:

from scipy.interpolate import LinearNDInterpolator as lNDI
print (lNDI(points=df.index.to_frame().values, values=df.result.values)([1.3, 1.7, 1.55]))

现在,如果您有所有元组 (a, b, c) 作为您要计算的索引的数据框,您可以这样做:

def pd_interpolate_MI (df_input, df_toInterpolate):
    from scipy.interpolate import LinearNDInterpolator as lNDI
    #create the function of interpolation
    func_interp = lNDI(points=df_input.index.to_frame().values, values=df_input.result.values)
    #calculate the value for the unknown index
    df_toInterpolate['result'] = func_interp(df_toInterpolate.index.to_frame().values)
    #return the dataframe with the new values
    return pd.concat([df_input, df_toInterpolate]).sort_index()

然后例如使用您的dfdf_toI = pd.DataFrame(index=pd.MultiIndex.from_tuples([(1.3, 1.7, 1.55),(1.7, 1.4, 1.9)],names=df.index.names)) 然后你得到

print (pd_interpolate_MI(df, df_toI))
              result
a   b   c           
1.0 1.0 1.00    6.00
        2.00    9.00
    2.0 1.00    8.00
        2.00   11.00
1.3 1.7 1.55    9.35
1.7 1.4 1.90   10.20
2.0 1.0 1.00    7.00
        2.00   10.00
    2.0 1.00    9.00
        2.00   12.00

【讨论】:

以上是关于插值多索引熊猫数据框的主要内容,如果未能解决你的问题,请参考以下文章

如何重新索引多索引熊猫数据框?

如何更改熊猫数据框中多索引的外层索引?

对唯一顺序索引的多索引熊猫数据框进行切片和赋值

如何将多索引列转换为熊猫数据框的单索引列?

在熊猫多索引数据框中返回满足逻辑索引条件的每个组的最后一行[重复]

访问熊猫数据框中内部多索引级别的最后一个元素