如果我按如下方式构建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')相同,如果我的数据帧已经是所需的形式,但我不确定如何也是为了实现这一点。
答案 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