2014-04-29 28 views
18

Mam DataFrame pandy, np:Jak mogę "rozpakować" określone kolumny z pandy DataFrame?

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

tj:

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

Jak mogę przekonwertować go do tego?

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 

Próbowałem stack i unstack ale nie byli w stanie tego dokonać.

Dzięki!

+0

Melt jest niesamowitą nazwą tej funkcji – kbball

Odpowiedz

20

Można to zrobić z 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') 

Wynik:

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] 

Nie jestem pewien, w jaki sposób wspólne „topić” jest nazwą dla tego rodzaju operacji, ale to, co nazywa się to w pakiecie R. reshape2, co prawdopodobnie zainspirowało to nazwisko.

+0

Fantastyczna - dziękuję! –

+0

Niewiarygodnie łatwa i niesamowita nazwa - topnij się! Wielkie dzięki! – kbball