2

I know, this questions has been asked several times, but I didn't manage to build my solution based on those already asked.

DF I have:

id| country  |  series name   | 2015 | 2016 | 2017
--+----------+----------------+------+------+------
0 | saudi    | fertility rate | 1    | 2    | 2   |    
1 | saudi    | CO2 emissions  | 5    | 10   | 15  | 
2 | pakistan | fertility rate | 1    | 2    | 1   |
3 | pakistan | CO2 emissions  | NaN  | NaN  | NaN |

DF I want:

id| country  | year | fertility rate | CO2 emissions 
--+----------+------+----------------+---------
0 | saudi    | 2015 |       1        |    5      
1 | saudi    | 2016 |       2        |    10      
2 | saudi    | 2017 |       2        |    15      
3 | pakistan | 2015 |       1        |    NaN
4 | pakistan | 2016 |       2        |    NaN
5 | pakistan | 2017 |       1        |    NaN

I tried multiple different melt configurations, but somehow I am not able to solve this problem.

igotBAWS
  • 105
  • 1
  • 11

1 Answers1

6

IIUC melt + pivot_table. This answer assumes that id is your index. If it is not, just drop it, as it is not needed in the calculation.


d = df.melt(id_vars=["country", "series name"], var_name="year")

d.pivot_table(
    index=["country", "year"], columns="series name", values="value"
).reset_index()

series name   country  year  CO2 emissions  fertility rate
0            pakistan  2015            NaN             1.0
1            pakistan  2016            NaN             2.0
2            pakistan  2017            NaN             1.0
3               saudi  2015            5.0             1.0
4               saudi  2016           10.0             2.0
5               saudi  2017           15.0             2.0
user3483203
  • 50,081
  • 9
  • 65
  • 94