[英]pandas perform interpolation over array and dataframe row without loop
我有一个相当大的 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.