繁体   English   中英

pandas 对数组和 dataframe 行执行无循环插值

[英]pandas perform interpolation over array and dataframe row without loop

我有一个相当大的 dataframe 我想

  1. 按行搜索包含值的区间
  2. 在点 1 找到的两个元素和另一个数组中的两个元素之间执行线性插值
  3. 使用插值向 dataframe 添加一列

我所做的涉及一个for循环,即:

给定 dataframe Fak的样本

     beta0     beta1     beta2     beta3     beta4     beta5     beta6     beta7     beta8     beta9    beta10
0    0.008665  0.061391  0.159690  0.223275  0.232535  0.251266  0.279847  0.465671  0.672253  0.914753 1.0
1    0.009121  0.064322  0.166623  0.232418  0.241945  0.261106  0.290169  0.477621  0.682283  0.916384 1.0
2    0.009491  0.066689  0.172210  0.239776  0.249516  0.269020  0.298463  0.487108  0.690031  0.917638 1.0
3    0.009733  0.068232  0.175837  0.244542  0.254418  0.274140  0.303820  0.493102  0.694703  0.918304 1.0
4    0.009860  0.069027  0.177687  0.246963  0.256906  0.276734  0.306523  0.495985  0.696696  0.918511 1.0

我有一个数组psi

[-12.97, -11.97, -10.97, -9.97, -8.97, -7.97, -6.97, -5.97, -4.97, -3.97, -2.97, -1.97]

我定义了我想在Fak中搜索的值,即intF = 0.16

我用以下循环计算新的 dataframe

dxlist = []
for i,Faki in Fak.iterrows():
    # interpolation boundaries ID
    if intF == 0.0:
        ip1 = 1
    elif intF == 1.0:
        ip1 = -1
    else:
        ip1 = np.where(Faki>int(intF)/100)[0][0]
    im1 = ip1-1
    # coefficients
    dfak = Faki[ip1] - Faki[im1]
    dpsi = psi[ip1] - psi[im1]
    m = dfak/dpsi
    q = Faki[im1]-m*psi[im1]
    # calculate
    intPsi = (int(intF)/100-q)/m
    intDi  = 2**intPsi
    dxlist.append(intDi)
dfout['newcolumn'] = dxlist

这有效,但速度很慢。

我缺少的是如何逐行计算线性插值并使用外部数组上的索引。

显然我找到了一个矢量化的解决方案:

psidf = Fak.copy()
psidf.loc[Fak.index] = psi
Fakp1 = Fak[Fak.ge(intF/100)].fillna(method='bfill',axis=1).iloc[:,0]
Fakm1 = Fak[Fak.le(intF/100)].fillna(method='ffill',axis=1).iloc[:,-1]
psip1 = psidf[Fak.ge(intF/100)].fillna(method='bfill',axis=1).iloc[:,0]
psim1 = psidf[Fak.le(intF/100)].fillna(method='ffill',axis=1).iloc[:,-1]
m     = (Fakp1-Fakm1)/(psip1-psim1)
q     = Fakm1-m*psim1
intDi_series = 2**((intF/100-q)/m)
intDi['d'+str(int(intF))+nsfx] = intDi_series

关键是生成一个以数组为行的数据库,具有与Fak相同的形状(在上述代码的前两行中完成)。

Then, I isolate the columns I need from each dataframe using the ge and le methods for pandas dataframe, and I use the indices in the newly generated dataframe

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM