假设我有这个pandas DataFrame:
>>> import pandas as pd, numpy as np
>>> df1 = pd.DataFrame([[np.nan, 2, np.nan, 0], [3, 4, np.nan, 1], [np.nan, np.nan, np.nan, 5]], columns=list('ABCD') )
>>> df = pd.concat([df1,df1], keys='EF', axis=1)
>>> df
E F
A B C D A B C D
0 NaN 2.0 NaN 0 NaN 2.0 NaN 0
1 3.0 4.0 NaN 1 3.0 4.0 NaN 1
2 NaN NaN NaN 5 NaN NaN NaN 5
如何将其转换为具有形状(3,2,4)的3D numpy数组?
答案 0 :(得分:1)
import pandas as pd
import numpy as np
df1 = pd.DataFrame([[np.nan, 2, np.nan, 0],
[3, 4, np.nan, 1],
[np.nan, np.nan, np.nan, 5]],
columns=list('ABCD') )
df = pd.concat([df1, df1], keys='EF', axis=1)
# A view of the data, changing it changes df
df_three_dim = df.values.reshape((3, 2, 4))
# A new array, changing it does not change df
df_three_dim_copy = df.values.reshape((3, 2, 4)).copy()
答案 1 :(得分:0)
这是一种通用的方式,可以对价值进行平衡,并为不同大小的级别设置帐户,并且帐户数量超过两个级别。
cols = pd.MultiIndex.from_product(df.columns.levels, names=df.columns.names)
d = df.reindex(columns=cols)
v = d.values.reshape((len(d),) + tuple(l.size for l in cols.levels))
v
array([[[ nan, 2., nan, 0.],
[ nan, 2., nan, 0.]],
[[ 3., 4., nan, 1.],
[ 3., 4., nan, 1.]],
[[ nan, nan, nan, 5.],
[ nan, nan, nan, 5.]]])
如果您认为要重新排列v
,可以transpose
v.transpose(1, 0, 2)
array([[[ nan, 2., nan, 0.],
[ 3., 4., nan, 1.],
[ nan, nan, nan, 5.]],
[[ nan, 2., nan, 0.],
[ 3., 4., nan, 1.],
[ nan, nan, nan, 5.]]])
具有缺少级别组件的3级MultiIndex列对象的更复杂示例
np.random.seed([3, 1415])
df = pd.DataFrame(
np.random.randint(10, size=(4, 7)),
columns=pd.MultiIndex.from_tuples([
('A', 'X', 'Yes'),
('A', 'X', 'No'),
('A', 'Y', 'No'),
('B', 'X', 'Yes'),
('B', 'Z', 'Yes'),
('C', 'Y', 'No'),
('C', 'Z', 'No')
])
)
df
A B C
X Y X Z Y Z
Yes No No Yes Yes No No
0 0 2 7 3 8 7 0
1 6 8 6 0 2 0 4
2 9 7 3 2 4 3 3
3 6 7 7 4 5 3 7
通过做与上面相同的事情我们得到
d
A B C
X Y Z X Y Z X Y Z
No Yes No Yes No Yes No Yes No Yes No Yes No Yes No Yes No Yes
0 2 0 7 NaN NaN NaN NaN 3 NaN NaN NaN 8 NaN NaN 7 NaN 0 NaN
1 8 6 6 NaN NaN NaN NaN 0 NaN NaN NaN 2 NaN NaN 0 NaN 4 NaN
2 7 9 3 NaN NaN NaN NaN 2 NaN NaN NaN 4 NaN NaN 3 NaN 3 NaN
3 7 6 7 NaN NaN NaN NaN 4 NaN NaN NaN 5 NaN NaN 3 NaN 7 NaN
它已经将缺失的位平方,以便我们有一个矩形阵列。
我会转换v
,以便更容易查看
v.transpose(3, 1, 2, 0)
array([[[[ 2., 8., 7., 7.],
[ 7., 6., 3., 7.],
[ nan, nan, nan, nan]],
[[ nan, nan, nan, nan],
[ nan, nan, nan, nan],
[ nan, nan, nan, nan]],
[[ nan, nan, nan, nan],
[ 7., 0., 3., 3.],
[ 0., 4., 3., 7.]]],
[[[ 0., 6., 9., 6.],
[ nan, nan, nan, nan],
[ nan, nan, nan, nan]],
[[ 3., 0., 2., 4.],
[ nan, nan, nan, nan],
[ 8., 2., 4., 5.]],
[[ nan, nan, nan, nan],
[ nan, nan, nan, nan],
[ nan, nan, nan, nan]]]])