2013-08-15 15 views
11

Jak przekonwertować istniejącą ramkę danych na kolumny jednopoziomowe tak, aby miały hierarchiczne kolumny indeksu (MultiIndex)?Konwertuj kolumny danych do MultiIndex

Przykład dataframe:

In [1]: 
import pandas as pd 
from pandas import Series, DataFrame 

df = DataFrame(np.arange(6).reshape((2,3)), 
       index=['A','B'], 
       columns=['one','two','three']) 
df 
Out [1]: 
    one two three 
A 0 1  2 
B 3 4  5 

bym nie pomyślał, że REINDEX() będzie działać, ale mam Nan:

In [2]: 
df.reindex(columns=[['odd','even','odd'],df.columns]) 
Out [2]: 
    odd even odd 
    one two three 
A NaN NaN NaN 
B NaN NaN NaN 

samo, jeśli używam DataFrame():

In [3]: 
DataFrame(df,columns=[['odd','even','odd'],df.columns]) 
Out [3]: 
    odd even odd 
    one two three 
A NaN NaN NaN 
B NaN NaN NaN 

To ostatnie podejście faktycznie działa, jeśli określę wartości df:

In [4]: 
DataFrame(df.values,index=df.index,columns=[['odd','even','odd'],df.columns]) 
Out [4]: 
    odd even odd 
    one two three 
A 0  1  2 
B 3  4  5 

Jaki jest właściwy sposób na zrobienie tego? Dlaczego reindex() daje NaN's?

Odpowiedz

14

Byłaś blisko, wystarczy ustawić kolumny bezpośrednio do nowego (równej wielkości) indeks-like (co jeśli jego list-z-listy przekonwertuje do multi-index)

In [8]: df 
Out[8]: 
    one two three 
A 0 1  2 
B 3 4  5 

In [10]: df.columns = [['odd','even','odd'],df.columns] 

In [11]: df 
Out[11]: 
    odd even odd 
    one two three 
A 0  1  2 
B 3  4  5 

reindex będzie zmienić kolejność/filtrować istniejący indeks. Powód, dla którego otrzymujesz wszystkie nans, mówisz, hej znajdź istniejące kolumny, które pasują do tego nowego indeksu; żaden nie pasuje, więc to właśnie otrzymujesz

Powiązane problemy