2017-07-10 1 views
2

Je suis confronté à un problème où l'ajout de nouvelles colonnes à une colonne multi-index DataFrame provoque l'ajout des nouvelles colonnes à la fin du DataFrame. .: par exemple Regroupement de colonnes multi-index pandas

Group 1   | Group 2  | Group 1 | Group 2 | 
------------------------------------------------------ 
Sub 1 | Sub 2 | Sub 1 | Sub 2 | New Sub | New Sub | 

Alors ce que je veux est:

Group 1     | Group 2     | 
------------------------------------------------------ 
Sub 1 | Sub 2 | New Sub | Sub 1 | Sub 2 | New Sub | 

Est-il possible de regrouper/classer mes multiindice faire cela? Remarque- Je ne veux pas réorganiser les sous-groupes par leur nom, car New Sub doit aller à la fin et, par ordre alphabétique, ne pas trier correctement.

+0

Comment mettre en place? –

Répondre

2

Je pense que vous avez besoin reindex ou reindex_axis par la coutume list:

df1=pd.DataFrame(columns=pd.MultiIndex.from_product((('C','R', 'A'),(1,2))), 
       data=np.arange(6).reshape(1,-1)) 
df2=pd.DataFrame(columns=pd.MultiIndex.from_tuples((('C','3'),('R',5),('A',4))), 
       data=[[9,9,4]]) 
df=df1.join(df2) 
print (df) 
    C  R  A  C R A 
    1 2 1 2 1 2 3 5 4 
0 0 1 2 3 4 5 9 9 4 

df1 = df.reindex(columns = ['C','R','A'], level=0) 
print (df1) 
    C  R  A  
    1 2 3 1 2 5 1 2 4 
0 0 1 9 2 3 9 4 5 4 

df1 = df.reindex_axis(['C','R','A'], level=0, axis=1) 
print (df1) 
    C  R  A  
    1 2 3 1 2 5 1 2 4 
0 0 1 9 2 3 9 4 5 4 
+0

jezrael, quelle est la différence entre l'approche 1 et 2? –

+1

Je ne pense rien (peut-être que je me trompe), des solutions alternatives. – jezrael

+0

Mais personnellement je préfère reindex_axis, mais je ne peux pas expliquer pourquoi;) – jezrael

2

Il vous suffit d'appeler df.sort_index après avoir réglé:

df1=pd.DataFrame(columns=pd.MultiIndex.from_product((('a','b'), 
(1,2))),data=np.arange(4).reshape(1,-1)) 
df2=pd.DataFrame(columns=pd.MultiIndex.from_tuples((('a','3'),('b',5))),data=[[9,9]]) 
df=df1.join(df2) 

# a  b  a b 
# 1 2 1 2 3 5 
# 0 0 1 2 3 9 9 

df.sort_index(axis=1,inplace=True) 

# a  b  
# 1 2 3 1 2 5 
# 0 0 1 9 2 3 9 
+0

Cela ne fonctionne pas pour les données entières. –