簡體   English   中英

插入pandas DataFrame

[英]Interpolation of a pandas DataFrame

我有一個pandas DataFrame(size = 34,19),我想用它作為查找表。

但是我想要查找的值是“在”數據幀中的值之間

例如:

      0.1      0.2      0.3     0.4    0.5
0.1   4.01  31.86   68.01   103.93  139.2
0.2  24.07  57.49   91.37   125.21  158.57
0.3  44.35  76.4    108.97  141.57  173.78
0.4  59.66  91.02   122.8   154.62  186.13
0.5  87.15  117.9   148.86  179.83  210.48
0.6  106.92 137.41  168.26  198.99  229.06
0.7  121.73 152.48  183.4   213.88  243.33

我知道要查找x = 5.5 y = 1.004的值,所以答案應該在114左右。

我用scipy的不同方法嘗試了它,但我得到的值總是如此。 我使用的最后一個方法是: inter = interpolate.interpn([np.array(np.arange(34)), np.array(np.arange(19))], np_matrix, [x_value, y_value],)
我甚至得到網格中存在的點的錯誤值。

有人能告訴我我做錯了什么或推薦一個簡單的解決方案嗎?


編輯:

另外一個問題是:來自和.xlsx文件的原始數據是:

      0.1      0.2      0.3     0.4    0.5
0.1   4.01  31.86   68.01   103.93  139.2
0.2  24.07  57.49   91.37   125.21  158.57
0.3  44.35  76.4    108.97  141.57  173.78
0.4  59.66  91.02   122.8   154.62  186.13
0.5  87.15  117.9   148.86  179.83  210.48
0.6  106.92 137.41  168.26  198.99  229.06
0.7  121.73 152.48  183.4   213.88  243.33

但是pandas添加了一個Index列:

               0.1      0.2      0.3     0.4    0.5
0     0.1     4.01    31.86    68.01    103.93  139.2
1     0.2    24.07    57.49    91.37    125.21  158.57
2     0.3    44.35    76.4    108.97    141.57  173.78
3     0.4    59.66    91.02   122.8     154.62  186.13
4     0.8    87.15   117.9    148.86    179.83  210.48
5     1.0   106.92   137.41   168.26    198.99  229.06
6     1.7   121.73   152.48   183.4     213.88  243.33

因此,如果我想訪問x = 0.4 y = 0.15,我必須輸入x = 3,y = 0.15。

讀取數據:

model_references = pd.ExcelFile(model_references_path)
Matrix = model_references.parse('Model_References')
n = Matrix.stack().reset_index().values
out = interpolate.griddata(n[:,0:2], n[:,2], (Stroke, Current), method='cubic')

您可以使用stack數據重新整形為3列 - 第一scipy.interpolate.griddata index ,第二scipy.interpolate.griddata列,最后一scipy.interpolate.griddata值,最后通過scipy.interpolate.griddata獲取值

from scipy.interpolate import griddata

a = 5.5
b = 1.004

n = df.stack().reset_index().values    
#https://stackoverflow.com/a/8662243
out = griddata(n[:,0:2], n[:,2], [(a, b)], method='linear')
print (out)
[104.563]

細節

n = df.stack().reset_index().values
print (n)
[[  1.     1.     4.01]
 [  1.     2.    31.86]
 [  1.     3.    68.01]
 [  1.     4.   103.93]
 [  1.     5.   139.2 ]
 [  2.     1.    24.07]
 [  2.     2.    57.49]
 [  2.     3.    91.37]
 [  2.     4.   125.21]
 [  2.     5.   158.57]
 [  3.     1.    44.35]
 [  3.     2.    76.4 ]
 [  3.     3.   108.97]
 [  3.     4.   141.57]
 [  3.     5.   173.78]
 [  4.     1.    59.66]
 [  4.     2.    91.02]
 [  4.     3.   122.8 ]
 [  4.     4.   154.62]
 [  4.     5.   186.13]
 [  5.     1.    87.15]
 [  5.     2.   117.9 ]
 [  5.     3.   148.86]
 [  5.     4.   179.83]
 [  5.     5.   210.48]
 [  5.     1.   106.92]
 [  5.     2.   137.41]
 [  5.     3.   168.26]
 [  5.     4.   198.99]
 [  5.     5.   229.06]
 [  6.     1.   121.73]
 [  6.     2.   152.48]
 [  6.     3.   183.4 ]
 [  6.     4.   213.88]
 [  6.     5.   243.33]]

嘗試interp2d從SciPy的。

import numpy as np
from scipy.interpolate import interp2d

x = [1, 2, 3, 4, 5, 6, 7]
y = [1, 2, 3, 4, 5]
z = [[4.01, 31.86, 68.01, 103.93, 139.2],
[24.07, 57.49, 91.37, 125.21, 158.57],
[44.35, 76.4, 108.97, 141.57, 173.78],
[59.66, 91.02, 122.8, 154.62, 186.13],
[87.15, 117.9, 148.86, 179.83, 210.48],
[106.92, 137.41, 168.26, 198.99, 229.06],
[121.73, 152.48, 183.4, 213.88, 243.33]]
z = np.array(z).T

f = interp2d(x, y, z)
f(x = 5.5, y = 1.004) # returns 97.15748

嘗試更改方法的kind參數以試驗返回值。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM