从Meshgrid重塑pandas DataFrame

时间:2015-05-26 23:07:13

标签: python numpy pandas

如果我按如下方式构建pandas DataFrame:

import numpy as np
import pandas as pd

x = np.arange(-5.01, 5.01, 0.25)
y = np.arange(-5.01, 5.01, 0.25)
xx, yy = np.meshgrid(x, y)
z = np.sin(xx**2+yy**2)
df = pd.DataFrame(z, index=x, columns=y)

我现在有一个41x41的DataFrame,其中每个值对应一个x,y对。我想重塑这个DataFrame,使得我有3列(X,Y,Z)和1681行,其中新的任意索引的范围为0-1680。

作为旁注,我相信这与撤消df.pivot('X','Y','Z')相同,如果我的数据帧已经是所需的形式,但我不确定如何也是为了实现这一点。

3 个答案:

答案 0 :(得分:4)

为什么不在numpy中全部完成?

>>> data = np.array([xx, yy, z]).reshape(3, -1).T
>>> data
array([[-5.01      , -5.01      , -0.0652361 ],
       [-4.76      , -5.01      , -0.59221922],
       [-4.51      , -5.01      ,  0.9936343 ], ...

答案 1 :(得分:0)

unstack将撤消pivot help on pandas.unstack()

df.unstack().reset_index().rename(columns={'level_0':'x','level_1':'y',0:'z'})
         x     y         z
0    -5.01 -5.01 -0.065236
1    -5.01 -4.76 -0.592219
2    -5.01 -4.51  0.993634

答案 2 :(得分:0)

您可以将多维数组重塑为一维数组并创建一个字典,然后可以轻松转换为有序的数据帧:

import numpy as np
import pandas as pd

x = np.arange(-5.01, 5.01, 0.25)
y = np.arange(-5.01, 5.01, 0.25)
xx, yy = np.meshgrid(x, y)
z = np.sin(xx**2+yy**2)
NT = np.product(xx.shape)

data = {
    "x": np.reshape(xx,NT),
    "y": np.reshape(yy,NT),
    "z": np.reshape(zz,NT)
}
df = pd.DataFrame(data=data)

df

将输出:

    x   y   z
0   -5.01   -5.01   -0.065236
1   -4.76   -5.01   -0.592219
2   -4.51   -5.01   0.993634
3   -4.26   -5.01   -0.670288
4   -4.01   -5.01   -0.333011
... ... ... ...
1676    3.99    4.99    0.020503
1677    4.24    4.99    -0.893283
1678    4.49    4.99    0.880967
1679    4.74    4.99    -0.241402
1680    4.99    4.99    -0.448675
1681 rows × 3 columns