2017-06-17 28 views
6

W pand jak przejść od:przekształcić wierszy do kolumn w Pandy dataframe

a = pd.DataFrame({'foo': ['m', 'm', 'm', 's', 's', 's'], 
        'bar': [1, 2, 3, 4, 5, 6]}) 
>>> a 
    bar foo 
0 1 m 
1 2 m 
2 3 m 
3 4 s 
4 5 s 
5 6 s 

do B:

b = pd.DataFrame({'m': [1, 2, 3], 
        's': [4, 5, 6]}) 
>>> b 
    m s 
0 1 4 
1 2 5 
2 3 6 

Próbowałem rozwiązań w innych odpowiedzi, na przykład here i here, ale nikt nie wydawał się robić tego, co chcę.

Zasadniczo chcę zamienić wiersze kolumnami i upuścić indeks, ale jak to zrobić?

Odpowiedz

5
a.set_index(
    [a.groupby('foo').cumcount(), 'foo'] 
).bar.unstack() 
+0

możesz szczegółowo nieco to, co się dzieje? Spojrzałem na dokumentację GroupBy.cumcount(), ale jest to trochę zagadkowe. – PedroA

+1

Przepraszam za brak szczegółów. Jestem na moim telefonie. Problem z posiadanymi informacjami polega na tym, że musisz rozróżnić różne wartości o tej samej wartości foo. Cumcount robi dokładnie to, tworząc 0, 1 i 2 dla pierwszych 3 i tak samo dla kolejnych trzech. Co więcej, będzie działał, jeśli nie będą miały rozmiaru 3. Biorąc pod uwagę pozycje, na które ustawiłem indeks, jest on idealnie rozmieszczony w celu uwolnienia. – piRSquared

+0

@piRSquared Dziękuję, dowiedz się więcej o set_index – Wen

3

To jest moje rozwiązanie

a = pd.DataFrame({'foo': ['m', 'm', 'm', 's', 's', 's'], 
        'bar': [1, 2, 3, 4, 5, 6]}) 
a.pivot(columns='foo', values='bar').apply(lambda x: pd.Series(x.dropna().values)) 

foo m s 
0 1.0 4.0 
1 2.0 5.0 
2 3.0 6.0