Как преобразовать значение столбца в новые столбцы в Python?

#python #pandas

#python #pandas

Вопрос:

Мой фрейм данных похож на:

 accident_type      office A    office B   office C    information      
1                   0          0         0           number        
1                   0          2         2           fatality        
1                   0          0         0           frequency      
2                   0          0         1           number          
2                   0          0         1           fatality        
2                   0          0         0           frequency 
3                   0          0         0           number   
3                   0          1         1           fatality  
3                   0          0         0           frequency
  

и я хочу добавить еще столбец, чтобы сдвинуть значение информации об аварии по вертикали, а позже я удалю столбцы office A, office B, office C и помещу их в другой новый столбец следующим образом:

 accident_type      information         office       number       fatality    frequency     
1                  number              office A        0            0           0
1                  fatality            office B        0            2           0
1                  frequency           office C        0            2           0
2                  number              office A        0            0           0
2                  fatality            office B        0            0           0
2                  frequency           office C        1            1           0 
3                  number              office A        0            0           0 
3                  fatality            office B        0            1           0
3                  frequency           office C        0            1           0
  

Я пробую df.melt, но это не дает мне ожидаемого результата.
Кто-нибудь может мне помочь, как я могу сделать это на Python?

Спасибо

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

1. Что происходит с двумя 2 s в столбцах office для несчастного случая типа 1 со смертельным исходом?

Ответ №1:

Я думаю, вам нужно DataFrame.melt с DataFrame.pivot_table :

 df = (df.melt(['accident_type','information'], 
             var_name='office')
      .pivot_table(index=['accident_type','office'], 
                   columns='information',
                   values='value', 
                   fill_value=0, 
                   aggfunc='sum')
      .reset_index()
      .rename_axis(None, axis=1))
print (df)
   accident_type    office  fatality  frequency  number
0              1  office A         0          0       0
1              1  office B         2          0       0
2              1  office C         2          0       0
3              2  office A         0          0       0
4              2  office B         0          0       0
5              2  office C         1          0       1
6              3  office A         0          0       0
7              3  office B         1          0       0
8              3  office C         1          0       0
  

Ответ №2:

похоже, вы хотите расплавить, а затем развернуть другую функцию?

 df = df.melt(id_vars=['accident_type', 'information'], var_name='office')
  

отключит ваши столбцы, но если вам нужны отдельные столбцы number, fatality и frequency, вам необходимо выполнить повторный поворот.

 df = df.pivot_table(index=['accident_type', 'information'], columns='office', values='value')
  

и если вы хотите это как обычный фрейм данных (не многоуровневый):

 df = pd.DataFrame(df.to_records())
  

(имейте в виду, что ваш второй свод — это сводная таблица — если у вас есть уникальные идентификаторы, вы можете использовать pandas ‘df.pivot’ вместо этого)