Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How can I "unpivot" specific columns from a pandas DataFrame?

I have a pandas DataFrame, eg:

x = DataFrame.from_dict({'farm' : ['A','B','A','B'],                           'fruit':['apple','apple','pear','pear'],                           '2014':[10,12,6,8],                           '2015':[11,13,7,9]}) 

ie:

   2014  2015 farm  fruit 0    10    11    A  apple 1    12    13    B  apple 2     6     7    A   pear 3     8     9    B   pear 

How can I convert it to this: ?

  farm  fruit  value  year 0    A  apple     10  2014 1    B  apple     12  2014 2    A   pear      6  2014 3    B   pear      8  2014 4    A  apple     11  2015 5    B  apple     13  2015 6    A   pear      7  2015 7    B   pear      9  2015 

I have tried stack and unstack but haven't been able to make it work.

Thanks!

like image 328
Racing Tadpole Avatar asked Apr 29 '14 01:04

Racing Tadpole


1 Answers

This can be done with pd.melt():

# value_name is 'value' by default, but setting it here to make it clear pd.melt(x, id_vars=['farm', 'fruit'], var_name='year', value_name='value') 

Result:

  farm  fruit  year  value 0    A  apple  2014     10 1    B  apple  2014     12 2    A   pear  2014      6 3    B   pear  2014      8 4    A  apple  2015     11 5    B  apple  2015     13 6    A   pear  2015      7 7    B   pear  2015      9  [8 rows x 4 columns] 

I'm not sure how common "melt" is as the name for this kind of operation, but that's what it's called in R's reshape2 package, which probably inspired the name here.

like image 193
Marius Avatar answered Oct 07 '22 16:10

Marius