Python 如何在两个单独的数据帧中的所有值之间进行插值?

Python 如何在两个单独的数据帧中的所有值之间进行插值?,python,pandas,interpolation,Python,Pandas,Interpolation,假设您有两个数据框,一个包含2020年的数据,另一个包含2030年的数据。两个数据帧具有相同的形状和列名,并且只包含数值。为简单起见,我们将按如下方式创建它们: twenty = pd.DataFrame({'A':[1,1,1], 'B':[3,3,3]}) thirty = pd.DataFrame({'A':[3,3,3], 'B':[7,7,7]}) 现在,我们的目标是对这些数据帧中的所有值执行线性插值,以获得2025年(或我们选择的任何年份)的新数据帧。因此,我们希望在每个成对的值集

假设您有两个数据框,一个包含2020年的数据,另一个包含2030年的数据。两个数据帧具有相同的形状和列名,并且只包含数值。为简单起见,我们将按如下方式创建它们:

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

twentyfive = pd.DataFrame({'A':[2,2,2],'B':[5,5,5]})
我试图使用
np.interp
;然而,据我所知,这实际上是针对给定(奇异)数组的插值。我已经用一种更强力的方法解决了这个问题:融合数据帧,添加年份列,将它们合并在一起,然后用插值创建一个新列。这有点凌乱和冗长


我觉得必须有一种更直接(优化)的方式来完成这项任务。感谢您的帮助。

如果两者形状相同,您可以尝试直接取平均值

(thirty + twenty)/2
输出:

编辑:如果数据帧的形状不相等,可以尝试与内部联接列和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
输出:


您可以
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

啊,说得好。我不确定我是否曾想过,如果数据帧具有相同的形状,可以将它们相加、相减,等等;但是,这是有道理的。而且,对于线性插值来说,更一般的做法是,不要除以2(本例中为2025年),而是将添加的数据帧乘以
(target-2020)/(2030-2020)
。是的,如果您有少量
数据帧,并且需要简单的线性插值,这可能是最好的方法。如果您有许多
数据帧
,并且需要计算哪两个数据帧需要用于给定年份的平均值,则可能会更加困难。非常聪明!这会让你同时度过所有的过渡期。好主意。尽管考虑到所有groupby重新编制索引的情况,它可能会相当慢,但插值仍然很慢。但是如果你有其他的帧,比如说33,39,59,97,它会很容易扩展。只需使用正确的键添加它们,即可立即获取所有内容。
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
s[25].unstack(0)

     A    B
0  2.0  5.0
1  2.0  5.0
2  2.0  5.0