使用 Pandas 在列之间插入任意值

问题描述 投票:0回答:2

我有包含“DaysFrom”列的记录,以及包含标准“DaysFrom”集值的其他列:

'Date'      'DaysFrom'  '90'    '180'   '360'
2023-11-04   135         4       5       12
2023-11-05   360         3       5       20
2023-11-06   270         5       7       15
2023-11-07   180         6       3       10

我想计算“DaysFrom”列中的值的线性插值(“IntVal”):

'Date'      'DaysFrom'  '90'    '180'   '360'   'IntVal'
2023-11-04   135         4       5       12      4.5
2023-11-05   360         3       5       20      20
2023-11-06   270         5       7       15      11
2023-11-07   180         6       3       10      3

为了便于计算,上面的示例仅使用位于一列或两列之间的“DaysFrom”值,但“DaysFrom”可以是 90 到 360 之间的任意值。

pandas dataframe regression interpolation
2个回答
0
投票

您可以根据

DaysFrom
范围有条件地进行线性插值:

import numpy as np
first_h = (df.DaysFrom - 90) / 90 * (df['180'] - df['90']) + df['90']
second_h = (df.DaysFrom - 180) / 180 * (df['360'] - df['180']) + df['180']

df['IntVal'] = np.where(df.DaysFrom < 180, first_h, second_h)

df
#         Date  DaysFrom  90  180  360  IntVal
#0  2023-11-04       135   4    5   12     4.5
#1  2023-11-05       360   3    5   20    20.0
#2  2023-11-06       270   5    7   15    11.0
#3  2023-11-07       180   6    3   10     3.0

0
投票

如果您想使用所有值进行插值(如果它们不全部在一条直线上),您可以使用

numpy.interp
:

循环遍历行
import numpy as np

cols = df.columns[2:]
tmp = df[cols]

df['IntVal'] = [np.interp(df.loc[i, 'DaysFrom'], cols, tmp.loc[i])
                for i in df.index]

输出:

         Date  DaysFrom  90  180  360  IntVal
0  2023-11-04       135   4    5   12     4.5
1  2023-11-05       360   3    5   20    20.0
2  2023-11-06       270   5    7   15    11.0
3  2023-11-07       180   6    3   10     3.0
© www.soinside.com 2019 - 2024. All rights reserved.