提取numpy 3D数组

时间:2018-04-04 09:40:53

标签: python pandas numpy

假设我有这个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数组?

2 个答案:

答案 0 :(得分:1)

您只需reshape数据框的values

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]]]])