Сделайте несколько столбцов фиктивными и переместите значения пандами

#python #pandas #dataframe #pivot-table

Вопрос:

У меня есть следующий кадр данных с пособиями на одного сотрудника. Есть 3 столбца для добавления льгот сотрудникам, но в самих пособиях нет точного столбца для размещения. Это и есть фрейм данных:

   Country Employee Name         Benefit 1   Total 1         Benefit 2  Total 2  
0      PT    Employee 1  Health Insurance  1000.0     Car allowance   1500.0   
1      PT    Employee 2  Health Insurance  1000.0               NaN      NaN   
2      PT    Employee 3  Health Insurance  1500.0               NaN      NaN   
3      DK    Employee 4               NaN     NaN  Health Insurance   1000.0   
4      DK    Employee 5               NaN     NaN   Study Allowance   2000.0   
5      DK    Employee 6               NaN     NaN               NaN      NaN   
6      CZ    Employee 7               NaN     NaN               NaN      NaN   
7      CZ    Employee 8     Car allowance  1000.0               NaN      NaN   
8      CZ    Employee 9               NaN     NaN    Food Allowance    500.0   
9      CZ   Employee 10               NaN     NaN               NaN      NaN   

        Benefit 3  Total 3 
0  Food Allowance    500.0  
1             NaN      NaN  
2             NaN      NaN  
3             NaN      NaN  
4             NaN      NaN  
5             NaN      NaN  
6             NaN      NaN  
7             NaN      NaN  
8   Car allowance   1500.0  
9             NaN      NaN
 

Мне нужно сделать уникальные значения выгоды 1, 2 и 3 в качестве заголовков столбцов, а затем добавить общую сумму выгоды в правильный столбец. Например, это выглядело бы так:

   Country Employee Name  Health Insurance  Food Allowance  Car Allowance  
0      PT    Employee 1            1000.0           500.0         1500.0   
1      PT    Employee 2             100.0             NaN            NaN   
2      PT    Employee 3            1500.0             NaN            NaN   
3      DK    Employee 4            1000.0             NaN            NaN   
4      DK    Employee 5               NaN             NaN            NaN   
5      DK    Employee 6               NaN             NaN            NaN   
6      CZ    Employee 7               NaN             NaN            NaN   
7      CZ    Employee 8               NaN             NaN         1000.0   
8      CZ    Employee 9               NaN           500.0         1500.0   

   Study Allowance  
0              NaN  
1              NaN  
2              NaN  
3              NaN  
4           2000.0  
5              NaN  
6              NaN  
7              NaN  
8              NaN
 

Каков был бы наилучший способ сделать это, принимая во внимание, что уникальные значения выгод неизвестны?

Ответ №1:

Давайте попробуем wide_to_long() pivot_table() и пару методов очистки:

 out=(pd.wide_to_long(df,['Benefit','Total'],['Country','Employee Name'],'drop',sep=' ')
       .reset_index()
       .pivot_table('Total',['Country','Employee Name'],'Benefit')
       .reset_index()
       .rename_axis(columns=None))
 

Теперь, если вы напечатаете out , вы получите желаемый результат