2016-06-15 44 views
5

ottengo come utilizzare pd.MultiIndex.from_tuples() al fine di modificare qualcosa comeCome fare Multi-Column from_tuples?

 Value 
(A,a) 1 
(B,a) 2 
(B,b) 3 

in

   Value 
Caps Lower  
A a   1 
B a   2 
B b   3 

Ma come faccio a cambiare tuple colonna sotto forma

 (A, a) (A, b) (B,a) (B,b) 
index 
1  1  2  2  3 
2  2  3  3  2 
3  3  4  4  1 

nella forma

Caps   A    B 
Lower  a  b  a  b 
index 
1   1  2  2  3 
2   2  3  3  2 
3   3  4  4  1 

Molte grazie.


Edit: La ragione per cui ho una colonna tupla è che quando ho aderito a un dataframe con una colonna singolo livello su una dataframe con una colonna Multi-Level si è scoperto il Multi-Column in una tupla di formato di stringhe e ha lasciato il singolo livello come stringa singola.


Edit 2 - soluzione alternativa: Come affermato il problema qui è sorto attraverso un join con differenti dimensioni a livello di colonna. Ciò significava che Multi-Column era ridotto a una tupla di stringhe. Per ovviare a questo problema, prima del join ho utilizzato df.columns = [('col_level_0','col_level_1','col_level_2')] per il DataFrame che desideravo aderire.

risposta

7

Assegna direttamente al columns con il risultato di pd.MultiIndex.from_tuples passando le colonne esistenti:

In [186]: 
l=[('A', 'a'), ('A', 'b'), ('B','a'), ('B','b')] 
df = pd.DataFrame(np.random.randn(5,4), columns = l) 
df 

Out[186]: 
    (A, a) (A, b) (B, a) (B, b) 
0 -0.876353 0.553742 1.631858 -0.561309 
1 0.463058 -0.455014 -0.491336 -1.436059 
2 0.337810 0.233624 -0.571749 -2.259763 
3 1.073057 -0.475894 0.999643 -0.379743 
4 0.441800 0.311202 -0.191552 0.291268 

In [187]:  
df.columns = pd.MultiIndex.from_tuples(df.columns, names=['Caps','Lower']) 
df 

Out[187]: 
Caps   A     B   
Lower   a   b   a   b 
0  -0.876353 0.553742 1.631858 -0.561309 
1  0.463058 -0.455014 -0.491336 -1.436059 
2  0.337810 0.233624 -0.571749 -2.259763 
3  1.073057 -0.475894 0.999643 -0.379743 
4  0.441800 0.311202 -0.191552 0.291268 

nota che è possibile assegnare direttamente a names attributo dell'attributo columns come la seguente:

df.columns.names = ['Caps','Lower'] 

da non confondere con l'attributo name

+0

Ok, forse non ho capito come usarlo per gli indici altrimenti avrei ho realizzato il sottile cambiamento che era necessario. Ora immagino di capire entrambi un po 'meglio! Grazie. – josh

+0

@Edchum, penso che non sia corretta la mia soluzione con i parametri in funzione 'from_tuples' - [vedi revisione] (http://stackoverflow.com/posts/37835622/revisions). Ma dipende da te. In bocca al lupo! – jezrael

+0

Mi è sembrato superfluo impostare l'attributo nomi come un ulteriore passaggio, non stavo copiando la tua soluzione nonostante quello che pensi, inoltre, c'è poca differenza tra queste 2 risposte se non tieni conto del passaggio di denominazione dato che il punto fondamentale è il fatto che l'OP voleva convertire i nomi delle tuple di colonne in un indice gerarchico – EdChum

2

Un'altra soluzione è l'uso MultiIndex.from_tuples con il parametro names:

import pandas as pd 

df = pd.DataFrame({'Value': [1,2,3]}, index=[('A','a'),('B','a'),('B','b')]) 
print (df) 
     Value 
(A, a)  1 
(B, a)  2 
(B, b)  3 

df.index = pd.MultiIndex.from_tuples(df.index, names=['Caps','Lower']) 
print (df) 
      Value 
Caps Lower  
A a   1 
B a   2 
    b   3 

Questo stesse opere con columns, vedere Edchum's answer:

df.columns= pd.MultiIndex.from_tuples(df.columns, names=['Caps','Lower']) 
+0

Sì, il mio fallimento è stato vedere che avevo bisogno di assegnarlo a 'df.columns' e non a' df.index' ma questo aiuterà gli altri che devono ancora vedere 'df.index = pd.MultiIndex.from_tuples (df. indice) 'e così via. Grazie. – josh

+0

Glad può aiutarti, buona fortuna! – jezrael