Python 数据帧插值 - 向数据帧添加新行

Python dataframe interpolation - adding a new row to a dataframe

我有一个数据框,我想在 EVM = 特定值 (-30) 时添加一个新行,并使用线性插值更新其他列。

Index    PwrOut      EVM       PwrGain    Vout

0    -0.760031   -58.322902  32.239969  134.331851

1   3.242575    -58.073389  32.242575   134.332376

2   7.246203    -57.138122  32.246203   134.343538

3   11.251078   -54.160870  32.251078   134.383609

4   15.257129   -48.624869  32.257129   134.487430

5   17.260618   -45.971596  32.260618   134.586753

6   18.263079   -44.319692  32.263079   134.656616

7   19.266674   -41.532695  32.266674   134.743599

8   20.271934   -37.546253  32.271934   134.849050

9   21.278990   -33.239208  32.278990   134.972439


10  22.286989   -29.221786  32.286989   135.111068

11  23.293533   -25.652448  32.293533   135.261357

例如,(在第 3 列中)EVM = -30 位于上面第 9 行和第 10 行之间。如何包含 EVM = -30 的新行(第 9 行和第 10 行之间),然后使用基于第 9 行数字之间 EVM 列位置的线性插值更新其他列(仅在该新行中)和 10? 如果能够搜索并找到 EVM =-30 之间的行,那就太好了。 是否可以对某些行应用线性插值而对其他列应用非线性插值?

谢谢!

插值是迄今为止最简单的部分。这是一种方法。

首先,找到缺失的行并逐行添加:

targets = (-50, -40, -30)  # Arbitrary
idxs = df.EVM.searchsorted(targets)  # Find the rows location
arr = df.values
for idx, target in zip(idxs, targets):
    arr = np.insert(arr, idx, [np.nan, target, np.nan, np.nan], axis=0)

df1 = pd.DataFrame(arr, columns=df.columns)

然后你实际上可以插值:

df2 = df1.interpolate('linear')

输出:

       PwrOut        EVM    PwrGain        Vout
0   -0.760031 -58.322902  32.239969  134.331851
1    3.242575 -58.073389  32.242575  134.332376
2    7.246203 -57.138122  32.246203  134.343538
3   11.251078 -54.160870  32.251078  134.383609
4   13.254103 -50.000000  32.254103  134.435519
5   15.257129 -48.624869  32.257129  134.487430
6   17.260618 -45.971596  32.260618  134.586753
7   18.263079 -44.319692  32.263079  134.656616
9   19.266674 -41.532695  32.266674  134.743599
8   19.769304 -40.000000  32.269304  134.796324
11  20.271934 -37.546253  32.271934  134.849050
12  21.278990 -33.239208  32.278990  134.972439
10  21.782989 -30.000000  32.282989  135.041753
13  22.286989 -29.221786  32.286989  135.111068
14  23.293533 -25.652448  32.293533  135.261357

如果您想按列自定义插值方法,请单独进行,例如:

df2.PwrOut = df1.PwrOut.interpolate('cubic')