Отображение значений столбцов в строках в соответствии с индексом

#python #pandas #dataframe #multi-index

Вопрос:

У меня есть фрейм данных с этой структурой

             Date              Values
Variable                
Var1        01/01/2021 0:00     1
Var1        01/01/2021 1:00     2
Var1        01/01/2021 2:00     3
Var2        01/01/2021 0:00     4
Var2        01/01/2021 1:00     5
Var3        01/01/2021 0:00     6
Var3        01/01/2021 1:00     7
Var3        01/01/2021 2:00     8
Var3        01/01/2021 3:00     9
 

и я хочу перевернуть оба столбца Date и Values построить одну строку на Variable :

         01/01/2021 0:00     01/01/2021 1:00     01/01/2021 2:00     01/01/2021 3:00
Var1           1                   2                   3                  NaN
Var2           4                   5                  NaN                 NaN
Var3           6                   7                   8                   9
 

Ответ №1:

Воспользуйся DataFrame.set_index с Series.unstack :

 df1 = df.set_index('Date', append=True)['Values'].unstack()
print (df1)
Date      01/01/2021 0:00  01/01/2021 1:00  01/01/2021 2:00  01/01/2021 3:00
Variable                                                                    
Var1                  1.0              2.0              3.0              NaN
Var2                  4.0              5.0              NaN              NaN
Var3                  6.0              7.0              8.0              9.0
 

И последнее добавление DataFrame.rename_axis :

 df1 = (df.set_index('Date', append=True)['Values']
         .unstack()
         .rename_axis(index=None, columns=None))
print (df1)
      01/01/2021 0:00  01/01/2021 1:00  01/01/2021 2:00  01/01/2021 3:00
Var1              1.0              2.0              3.0              NaN
Var2              4.0              5.0              NaN              NaN
Var3              6.0              7.0              8.0              9.0
 

Комментарии:

1. как я могу преобразовать значение 1.0 в 1 в этом случае? может быть, было бы лучше, если бы тип был int.

2. @everfight — Есть NaN s, поэтому возможным решением является .astype('Int64')