如何在两个独立的熊猫数据框的所有值之间插值?

时间:2019-02-05 16:35:03

标签: python pandas interpolation

让我们假设您有两个Pandas DataFrame,一个包含2020年的数据,另一个包含2030年的数据。两个DataFrame具有相同的形状,列名,并且仅包含数字值。为简单起见,我们将按如下所示创建它们:

twenty = pd.DataFrame({'A':[1,1,1], 'B':[3,3,3]})
thirty = pd.DataFrame({'A':[3,3,3], 'B':[7,7,7]})

现在,目标是对这些DataFrame中的所有值执行线性插值,以获取2025年(或我们选择的任何年份)的新DataFrame。因此,我们希望在每个成对的值集之间进行插值,例如twenty['A'][0]thirty['A'][0]。如果我们在目标年份2025年这样做,结果应该是:

twentyfive = pd.DataFrame({'A':[2,2,2],'B':[5,5,5]})

我尝试使用np.interp;但是,据我所知,这实际上是为了在给定(单个)数组上进行插值。而且,我已经使用一种更加蛮力的方法解决了该问题,该方法包括熔化DataFrame,添加Year列,将它们合并在一起,然后使用插值创建新列。这有点杂乱无章。

我觉得必须有一种更直接(且经过优化)的方式来执行此任务。任何帮助表示赞赏。

2 个答案:

答案 0 :(得分:1)

如果两者的形状相同,则可以尝试直接求平均值

(thirty + twenty)/2

出局:

    A   B
0   2   5
1   2   5
2   2   5

编辑:如果数据框的形状不相等,则可以尝试与内部连接和groupby列合并以采用插值均值。

df = pd.merge(twenty,thirty, left_index=True, right_index=True, how='inner').rename(columns=lambda x: x.split('_')[0])
df.T.groupby(df.T.index).mean().T

出局:

    A   B
0   2   5
1   2   5
2   2   5

答案 1 :(得分:1)

您可以concat对键很聪明(将它们命名为整数),然后groupby可以插值所有内容:

import pandas as pd

df = pd.concat([twenty, thirty], keys=[20,30], axis=1)
s = (df.groupby(df.columns.get_level_values(1), axis=1)
        .apply(lambda x: x.T.reset_index(1, drop=True).reindex(np.arange(20,31)).interpolate())).T

      20   21   22   23   24   25   26   27   28   29   30
A 0  1.0  1.2  1.4  1.6  1.8  2.0  2.2  2.4  2.6  2.8  3.0
  1  1.0  1.2  1.4  1.6  1.8  2.0  2.2  2.4  2.6  2.8  3.0
  2  1.0  1.2  1.4  1.6  1.8  2.0  2.2  2.4  2.6  2.8  3.0
B 0  3.0  3.4  3.8  4.2  4.6  5.0  5.4  5.8  6.2  6.6  7.0
  1  3.0  3.4  3.8  4.2  4.6  5.0  5.4  5.8  6.2  6.6  7.0
  2  3.0  3.4  3.8  4.2  4.6  5.0  5.4  5.8  6.2  6.6  7.0

现在,如果您只关心25:

s[25].unstack(0)

     A    B
0  2.0  5.0
1  2.0  5.0
2  2.0  5.0