python - 插值 PANDAS df

标签 python pandas interpolation

我知道这个主题在堆栈溢出时被提出过几次,但我仍然被插值问题绊倒了。

我有一组列的复杂数据框,如果简化它可能看起来像这样:

df_new = pd.DataFrame(np.random.randn(5,7), columns=[402.3, 407.2, 412.3, 415.8, 419.9, 423.5, 428.3])
wl     = np.array([400.0, 408.2, 412.5, 417.2, 420.5, 423.3, 425.0])

因此,我需要做的是按列对每一行的 cols (wl) 的新分配值进行插值。

以及如何获取新数据框,其列仅包含 wl 数组中显示的值?

最佳答案

使用 reindexwl 包含为新列(其值将填充 NaN)。 然后使用 interpolate(axis=1) 对列进行插值。 严格来说,插值仅在 已知值之间进行。 但是,您可以使用 limit_direction='both' 在前向和后向填充 NaN 边缘值:

>>> df_new.reindex(columns=df_new.columns.union(wl)).interpolate(axis=1, limit_direction='both')
      400.0     402.3     407.2     408.2     412.3     412.5     415.8     417.2     419.9     420.5     423.3     423.5     425.0     428.3
0  0.342346  0.342346  1.502418  1.102496  0.702573  0.379089  0.055606 -0.135563 -0.326732 -0.022298  0.282135  0.586569  0.164917 -0.256734
1 -0.220773 -0.220773 -0.567199 -0.789194 -1.011190 -0.485832  0.039526 -0.426771 -0.893069 -0.191818  0.509432  1.210683  0.414023 -0.382636
2  0.078147  0.078147  0.335040 -0.146892 -0.628824 -0.280976  0.066873 -0.881153 -1.829178 -0.960608 -0.092038  0.776532  0.458758  0.140985
3 -0.792214 -0.792214  0.254805  0.027573 -0.199659 -1.173250 -2.146841 -1.421482 -0.696124 -0.073018  0.550088  1.173194 -0.049967 -1.273128
4 -0.485818 -0.485818  0.019046 -1.421351 -2.861747 -1.020571  0.820605  0.097722 -0.625160 -0.782700 -0.940241 -1.097781 -0.809617 -0.521453

请注意,Pandas DataFrames 将值存储在 primarily column-based 中数据结构。因此,按列而不是按行进行计算通常效率更高。因此,转置您的数据框可能会更好:

df = df_new.T

然后按照上述类似的方式进行:

df = df.reindex(index=df.index.union(wl))
df = df.interpolate(limit_direction='both')

如果你想外推边值,你可以使用 scipy.interpolate.interp1d和 : fill_value='外推':

import numpy as np
import pandas as pd
import scipy.interpolate as interpolate
np.random.seed(2018)

df_new = pd.DataFrame(np.random.randn(5,7), columns=[402.3, 407.2, 412.3, 415.8, 419.9, 423.5, 428.3])
wl = np.array([400.0, 408.2, 412.5, 417.2, 420.5, 423.3, 425.0, 500])

x = df_new.columns
y = df_new.values
newx = x.union(wl)
result = pd.DataFrame(
    interpolate.interp1d(x, y, fill_value='extrapolate')(newx),
    columns=newx)

产量

      400.0     402.3     407.2     408.2     412.3     412.5     415.8     417.2     419.9     420.5     423.3     423.5     425.0     428.3      500.0
0 -0.679793 -0.276768  0.581851  0.889017  2.148399  1.952520 -1.279487 -0.671080  0.502277  0.561236  0.836376  0.856029  0.543898 -0.142790 -15.062654
1  0.484717  0.110079 -0.688065 -0.468138  0.433564  0.437944  0.510221  0.279613 -0.165131 -0.362906 -1.285854 -1.351779 -0.758526  0.546631  28.904127
2  1.303039  1.230655  1.076446  0.628001 -1.210625 -1.158971 -0.306677 -0.563028 -1.057419 -0.814173  0.320975  0.402057  0.366778  0.289165  -1.397156
3  2.385057  1.282733 -1.065696 -1.191370 -1.706633 -1.618985 -0.172797 -0.092039  0.063710  0.114863  0.353577  0.370628 -0.246613 -1.604543 -31.108665
4 -3.360837 -2.165729  0.380370  0.251572 -0.276501 -0.293597 -0.575682 -0.235060  0.421854  0.469009  0.689062  0.704780  0.498724  0.045401  -9.804075

如果您希望创建一个仅包含 wl 列的 DataFrame,您可以使用 result[wl] 子选择这些列,或者您可以简单地仅在wl 值:

result_wl = pd.DataFrame(
    interpolate.interp1d(x, y, fill_value='extrapolate')(wl),
    columns=wl)

关于python - 插值 PANDAS df,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51271709/

相关文章:

shell - 每次使用时如何评估 shell 变量

python - 如何在 Python 中分析多线程程序?

python - 如何将状态表映射到numpy中的生命表?

pandas - 如何使用 nltk 从大文本语料库中仅提取英语单词?

python - 在 python pandas 中创建交叉表,显示存在哪些值

python - scipy.interpolate.Rbf 的意外结果

python - 从点到函数的最短距离 scipy

python - 无法使多变量线性回归收敛

python - 如何导入自己的模块进行模拟? (导入错误 : no module named my_module!)

python - 具有相同列名的内部合并数据帧并应用聚合函数