2014-10-08 42 views
5

Widziałem kilka wariacji na temat eksplodowania kolumny/serii w wielu kolumnach ramki danych Pandy, ale próbowałem coś zrobić i nie udawało się to z istniejącymi podejściami.Pandy wartości kolumn do kolumn?

Biorąc pod uwagę DataFrame tak:

key  val 
id 
2 foo oranges 
2 bar bananas 
2 baz apples 
3 foo grapes 
3 bar  kiwis 

chcę konwertować pozycje w serii do kolumn key, z wartościami val służąc jako wartości, tak jak poniżej:

 foo  bar  baz 
id 
2 oranges bananas  apples 
3 grapes  kiwis  NaN 

I Czuję, że to jest coś, co powinno być względnie proste, ale od kilku godzin walczę z tym z rosnącym poziomem splatania i bez powodzenia.

Odpowiedz

10

Istnieje kilka sposobów:

użyciu .pivot_table:

>>> df.pivot_table(values='val', index=df.index, columns='key', aggfunc='first') 
key  bar  baz  foo 
id       
2 bananas apples oranges 
3  kiwis  NaN grapes 

użyciu .pivot:

>>> df.pivot(index=df.index, columns='key')['val'] 
key  bar  baz  foo 
id       
2 bananas apples oranges 
3  kiwis  NaN grapes 

użyciu .groupby następnie .unstack:

>>> df.reset_index().groupby(['id', 'key'])['val'].aggregate('first').unstack() 
key  bar  baz  foo 
id       
2 bananas apples oranges 
3  kiwis  NaN grapes 
+0

Wunderbar! Szedłem trzecią ścieżką i zaplątałem się, ale nie miałem pojęcia, że ​​istnieje istniejąca metafora w całym obszarze obrotu. Dziękuję Ci! –

2

Można użyć set_index i unstack

In [1923]: df.set_index([df.index, 'key'])['val'].unstack() 
Out[1923]: 
key  bar  baz  foo 
id 
2 bananas apples oranges 
3  kiwis None grapes 

Albo uproszczony groupby

In [1926]: df.groupby([df.index, 'key'])['val'].first().unstack() 
Out[1926]: 
key  bar  baz  foo 
id 
2 bananas apples oranges 
3  kiwis None grapes 
Powiązane problemy