python - 与数据框和数组一起使用时如何使用 scipy griddata

标签 python pandas scipy interpolation

我有以下数据框:

    A   B   C
0   2   0.7904  0.278784507354
1   2   0.7904  0.278784507354
2   2   0.7904  0.348480634192
3   2   0.7904  0.348480634192
4   2   0.7904  0.418176761031
5   2   0.7904  0.418176761031
6   2   0.7904  0.487872887869
7   2   0.7904  0.487872887869
8   2   0.7904  0.529690563972
9   2   0.7904  0.529690563972
10  2   0.7904  0.54362978934
11  2   0.7904  0.54362978934
12  2   0.7904  0.557569014708
13  2   0.7904  0.557569014708
14  2   0.7904  0.571508240076
15  2   0.7904  0.571508240076
16  2   0.7904  0.585447465443
17  2   0.7904  0.585447465443
18  2   0.7904  0.592417078127
19  2   0.7904  0.592417078127
20  2   0.7904  0.599386690811
21  2   0.7904  0.599386690811
22  2   0.7904  0.606356303495
23  2   0.7904  0.606356303495
24  2   0.7904  0.613325916179
25  2   0.7904  0.613325916179
26  2   0.7904  0.620295528862
27  2   0.7904  0.620295528862
28  2   0.7904  0.627265141546
29  2   0.7904  0.627265141546
30  2   0.7904  0.63423475423
31  2   0.7904  0.63423475423
32  2   0.7904  0.641204366914
149 2   0.3847  1.04544190258
150 2   0.3847  1.05241151526
151 2   0.4248  1.05241151526
152 2   0.3847  1.05938112794
153 2   0.4248  1.05938112794
154 2   0.3847  1.06635074063
155 2   0.4248  1.06635074063
156 2   0.3847  1.07332035331
157 2   0.4248  1.07332035331
158 2   0.3847  1.08725957868
159 2   0.4248  1.08725957868
235 9   0.6816  0.919988874268
236 9   0.8164  0.926958486952
237 9   0.6608  0.926958486952
238 9   0.64    0.933928099636
239 9   0.7449  0.933928099636
240 9   0.7289  0.940897712319
241 9   0.6764  0.940897712319
242 9   0.7128  0.947867325003
243 9   0.7128  0.947867325003
244 9   0.5883  0.954836937687
245 9   0.6626  0.954836937687
246 9   0.675   0.961806550371
247 9   0.675   0.961806550371
350 16  0.6229  0.933928099636
351 16  0.6641  0.933928099636
352 16  0.7124  0.940897712319
353 16  0.7124  0.940897712319
354 16  0.6814  0.947867325003
355 16  0.6193  0.947867325003
596 23  0.4222  1.15695570552
597 23  0.4928  1.15695570552
598 23  0.4222  1.17089493089
599 23  0.4928  1.17089493089
600 23  0.4928  1.18483415625
709 30  0.5404  1.15695570552
710 30  0.5088  1.17089493089
711 30  0.5439  1.17089493089
712 30  0.4953  1.18483415625
713 30  0.4953  1.18483415625
714 30  0.4953  1.19877338162
715 30  0.4953  1.19877338162
716 30  0.4953  1.21271260699
717 30  0.4953  1.21271260699
718 30  0.4953  1.22665183236
719 30  0.4953  1.22665183236
778 37  0.6862  0.961806550371
799 37  0.5957  1.03150267721
800 37  0.6671  1.03847228989
801 37  0.6085  1.03847228989
802 37  0.5883  1.04544190258
826 37  0.5134  1.18483415625
827 37  0.6135  1.18483415625
874 58  0.769   0.864231972797
875 58  0.7491  0.864231972797
876 58  0.768   0.878171198165
939 58  0.4921  1.32422640993
940 58  0.4921  1.39392253677
941 58  0.4902  1.39392253677
942 58  0.4921  1.46361866361
943 58  0.4902  1.46361866361
944 114 1.1536  0.0696961268385
954 114 1.0766  0.348480634192
955 114 1.1536  0.348480634192
956 114 1.1536  0.418176761031

还有更多观察结果,但由于帖子大小限制,我需要截断。

我正在尝试使用以下内容在“网格”上进行插值:

interp_A = np.array([30,60,90,180])
interp_B = np.array([1.0,1.0,1.0,1.0])
grid_z1 = griddata((data['A'],data['B']), data['C'], (interp_A, interp_B), method='nearest')

我回来了:

675     0.6057
895     0.6492
1039    0.6884
1256    0.6996

根据我所做的一些测试,我的 30、60、90、180 似乎被映射到 675、895、1039 和 1256。

如果我改为调用:

grid_z1 = griddata((data['A'].values,data['B'].values), data['C'].values, (interp_A, interp_B), method='nearest')

我得到:

[ 0.54    0.6464  0.6673  0.6772]

使用此库处理 pandas 数据的正确方法是什么?

谢谢!

最佳答案

使用griddata中的示例我计算

grid_z0 = interpolate.griddata(points, values, (grid_x, grid_y), method='nearest')

并制作了一个数据框:

df = pd.DataFrame({'A':points[:,0], 'B':points[:,1], 'C':values})

使用 values 我得到与原始值相同的插值:

grid_z1 = interpolate.griddata((df['A'].values,df['B'].values), df['C'].values, (grid_x, grid_y), method='nearest')
np.allclose(grid_z1,grid_z0)   # True

但是如果我尝试复制你的其他方法

grid_z2 = interpolate.griddata((df['A'],df['B']), df['C'], (grid_x, grid_y), method='nearest')

我收到错误:

ValueError: Buffer has wrong number of dimensions (expected 1, got 2)

该错误来自于 pandas 索引。我的数据框的结构可能与您的不同。

In [17]: df.info()
<class 'pandas.core.frame.DataFrame'>
Int64Index: 1000 entries, 0 to 999
Data columns (total 3 columns):
A    1000 non-null float64
B    1000 non-null float64
C    1000 non-null float64
dtypes: float64(3)
memory usage: 31.2 KB

无论如何,将列值传递给griddata是正确的方法。 griddata 并非旨在直接处理 pandas Series。它需要 numpy 数组,而不是包含数组的对象。

关于python - 与数据框和数组一起使用时如何使用 scipy griddata,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41517498/

相关文章:

python & smtplib : Is sending mail via gmail using oauth2 possible?

python-3.x - 合并两个 pandas 数据框,并在由管道分隔的列中输入匹配的条目

python - 更新列表中的 Python for 循环是如何工作的?

python - request.get 在循环时返回 400 响应——即使 URL 仍然相同

python - 根据第一个字符对列列表(年份)进行切片

python - 如果另一列是 NaN,如何替换列中的值?

python - 聚类分析的适用性

python - python中的多处理嵌套数值积分

python - 冷冻 Python 中的 Scipy : Cannot import name nonlin

Python Flet 异步