преобразовать 2D-фрейм в 3D-фрейм - PullRequest
0 голосов
/ 25 марта 2020

У меня есть 2D-кадр данных с формой (16422,28) следующим образом:

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

Мне нужно преобразовать его в 3D-кадр данных формы (16422,28,1). Следующее даст мне 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. Затем я попытался создать трехмерный фрейм данных с многоуровневым индексом следующим образом:

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 голосов
/ 25 марта 2020

Настройка

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...