将2D数据帧转换为3D数据帧

时间:2020-03-25 19:08:39

标签: python pandas dataframe

我有一个形状为(16422,28)的2D数据框,如下所示:

df= 
        id     var0    var1    var2    var3    var4 ...  var27
        5171   10.0    2.8     0.0     5.0     1.0  ...  9.4  
        5171   40.9    2.5     3.4     4.5     1.3  ...  7.7  
        5171   60.7    3.1     5.2     6.6     3.4  ...  1.0
        ...
        5171   0.5     1.3     5.1     0.5     0.2  ...  0.4
        4567   1.5     2.0     1.0     4.5     0.1  ...  0.4  
        4567   4.4     2.0     1.3     6.4     0.1  ...  3.3  
        4567   6.3     3.0     1.5     7.6     1.6  ...  1.6
        ...
        4567   0.7     1.4     1.4     0.3     4.2  ...  1.7
       ... 
        9584   0.3     2.6     0.0     5.2     1.6  ...  9.7  
        9584   0.5     1.2     8.3     3.4     1.3  ...  1.7  
        9584   0.7     3.0     5.6     6.6     3.0  ...  1.0
        ...
        9584   0.7     1.3     0.1     0.0     2.0  ...  1.7

我需要将其转换为形状为(16422,28,1)的3D数据框。以下将给我3D ndarray:

values_3d = df.values.reshape(df.shape[0], df.shape[1], 1)

我试图使用pd.Panel()将ndarray转换为3d数据帧:

tmp = pd.Panel(values_3d,  major_axis=df.index, minor_axis=df.columns)

但是它抱怨TypeError: Panel() takes no argument。然后我尝试创建具有多级索引的3D数据框,如下所示:

tmp = pd.DataFrame(values_3d, columns=df.columns
                , index=pd.MultiIndex.from_product(np.arange(start=0, stop=values_3d.shape[0]), df.index))

它给了我这个错误:TypeError: Input must be list-like

我该如何重塑?

1 个答案:

答案 0 :(得分:0)

设置

np.random.seed([3, 1415])
data_2d = np.random.randint(10, size=(10, 5))
df_2d = pd.DataFrame(data_2d).add_prefix('var')

df_2d

   var0  var1  var2  var3  var4
0     0     2     7     3     8
1     7     0     6     8     6
2     0     2     0     4     9
3     7     3     2     4     3
4     3     6     7     7     4
5     5     3     7     5     9
6     8     7     6     4     7
7     6     2     6     6     5
8     2     8     7     5     8
9     4     7     6     1     5

pd.concat

您似乎要添加长度为1的尺寸。

沿axis=0

# This will be the index label
#           ↓
pd.concat({'label': df_2d})

         var0  var1  var2  var3  var4
label 0     0     2     7     3     8
      1     7     0     6     8     6
      2     0     2     0     4     9
      3     7     3     2     4     3
      4     3     6     7     7     4
      5     5     3     7     5     9
      6     8     7     6     4     7
      7     6     2     6     6     5
      8     2     8     7     5     8
      9     4     7     6     1     5

您可以标记新的索引级别

#                This is the name of the index level
# This will be the index label      │
#           ↓                       ↓
pd.concat({'label': df_2d}, names=['name_of_level'])

                 var0  var1  var2  var3  var4
name_of_level                                
label         0     0     2     7     3     8
              1     7     0     6     8     6
              2     0     2     0     4     9
              3     7     3     2     4     3
              4     3     6     7     7     4
              5     5     3     7     5     9
              6     8     7     6     4     7
              7     6     2     6     6     5
              8     2     8     7     5     8
              9     4     7     6     1     5

沿axis=1

# This will be the index label
#           ↓
pd.concat({'label': df_2d}, axis=1)    

  label                    
   var0 var1 var2 var3 var4
0     0    2    7    3    8
1     7    0    6    8    6
2     0    2    0    4    9
3     7    3    2    4    3
4     3    6    7    7    4
5     5    3    7    5    9
6     8    7    6    4    7
7     6    2    6    6    5
8     2    8    7    5    8
9     4    7    6    1    5