我有一個3百萬行數據框中包含不同的值:大熊貓插值:使用np.interp不斷變化值
d a0 a1 a2
0.5 10.0 5.0 1.0
0.8 10.0 2.0 0.0
我想的線性插值來填補第四列(A0,A1, A2),其採用在 「d」 情況下的值,
d a0 a1 a2 newcol
1.5 10.0 5.0 1.0 3.0
0.8 10.0 2.0 0.0 3.6
NEWCOL是一個之間的加權平均[INT(d)]和a [INT(d + 1)],例如當d = 0.8時,newcol = 0.2 * a0 + 0.8 * a1因爲0.8是0和1之間80%的方式
我發現可以使用np.interp,但是沒有辦法讓我把在變量三名名):
df["newcol"]=np.interp(df["d"],[0,1,2], [100,200,300])
將確實給我
d a0 a1 a2 newcol
1.5 10.0 5.0 1.0 250.0
0.8 10.0 2.0 0.0 180.0
但我沒有辦法指定的值向量的變化:
df["newcol"]=np.interp(df["d"],[0,1,2], df[["a0","a1","a2"]])
給了我下面的回溯:
File "C:\Python27\lib\site-packages\numpy\lib\function_base.py", line 1271, in interp return compiled_interp(x, xp, fp, left, right) ValueError: object too deep for desired array
有什麼辦法在每行使用的值不同的載體?你能想到任何解決方法嗎?
基本上,我找不到任何方法來創建基於定義這個新列:
What is the value in x = column "d" of the function that is piecewise linear between given points and whose values at these points are described in the columns "ai"
編輯:之前,我用scipy.interp1d,這是不是內存使用效率,註釋幫我解決部分我的問題
EDIT2:
我試圖從EV-BR是說,我不得不嘗試編寫循環自己的辦法。
for i in range(len(tps)):
columns=["a1","a2","a3"]
length=len(columns)
x=np.maximum(0,np.minimum(df.ix[i,"d"],len-2))
xint = np.int(x)
xfrac = x-xint
name1=columns[xint]
name2=columns[xint+1]
tps.ix[i,"Multiplier"]=df.ix[i,name1]+xfrac*(df.ix[i,name2]-tps.ix[i,name1])
上面的循環每秒循環約50次,所以我想我有一個主要的優化問題。在DataFrame上工作的哪部分我做錯了?
如果你只需要線性插值,'numpy.interp'可能理智的。 –
或者,您可以按照您展示的方式計算應用函數內的加權平均值。 – Evert
感謝您的評論,我現在使用np.interp,我更接近我的答案,所以我相應地修改了我的問題(現在更清晰) – WNG