2017-07-31 3 views
-1

Je travaille avec les pandas, et je suis en train de convertir la première ligne de la dataframe en colonne, j'ai essayé la fonction stack(), mais ça ressemble f% # ¤ed. Je ne peux pas vraiment utiliser stack() puisque j'ai des colonnes de différents en-têtes. disons, votre bloc de données ressemble à ce qui suit: (boîte rouge: comment mon dataframe ressemble (boîte jaune: comment je veux que mon dataframe ressemble) enter image description hereComment faire pour convertir la première ligne de la dataframe en colonne

Je suis gratefull si vous pouvez me aider

.

Cheers,

+1

Pouvez-vous ajouter un peu de l'échantillon? – jezrael

+0

Ou avez-vous besoin de 'df = df.iloc [0] .to_frame()'? – jezrael

Répondre

1

Je pense que vous avez besoin:

df = df.stack().rename_axis(('a','b','c')).reorder_levels([2,0,1]).sort_index() 
print (df) 
c  a b 
2014 A A1 1 
     A1 9 
     B B1 9 
     B2 1 
2015 A A1 5 
     A1 4 
     B B1 1 
     B2 7 
2016 A A1 5 
     A1 1 
     B B1 6 
     B2 7 
dtype: int64 

Et si besoin columns de Multiindex:

df = df.stack() 
     .rename_axis(('a','b','c')) 
     .reorder_levels([2,0,1]) 
     .sort_index() 
     .reset_index(name='count') 
print (df) 

     c a b count 
0 2014 A A1  1 
1 2014 A A1  9 
2 2014 B B1  9 
3 2014 B B2  1 
4 2015 A A1  5 
5 2015 A A1  4 
6 2015 B B1  1 
7 2015 B B2  7 
8 2016 A A1  5 
9 2016 A A1  1 
10 2016 B B1  6 
11 2016 B B2  7 

EDIT:

Il y a problème, vous devez convertir la première et la deuxième colonne à Multiindex par le paramètre index_col:

tab3 = "C:\\Users\\abk29\\NordicMontlyDemand\\NordicDY\\Book1.xls" 
df = pd.read_excel(tab3, sheetname="Sheet1", skiprows=2, index_col=[0,1]) 
print (df) 
       2016 2017 2018 
    Unnamed: 1     
A A1    1  1  1 
    A2    2  2  2 
B B1    3  3  3 
    B2    4  4  4 
df = df.stack().rename_axis(('a','b','c')).reorder_levels([2,0,1]).sort_index() 
print (df) 
c  a b 
2016 A A1 1 
     A2 2 
     B B1 3 
     B2 4 
2017 A A1 1 
     A2 2 
     B B1 3 
     B2 4 
2018 A A1 1 
     A2 2 
     B B1 3 
     B2 4 
dtype: int64 
+0

toujours résultat très étrange:/ – BEAst

+0

Pouvez-vous vérifier la réponse éditée? – jezrael

+0

c'est une très bonne solution, mais la fonction pile est la clé principale/problème, elle dit que je n'ai qu'un seul niveau et pas trois, donc je ne peux pas le réorganiser ... – BEAst

1

IIUC:

In [199]: df = pd.DataFrame(np.random.randint(5, size=(5,3)), columns=list('abc')) 

In [200]: df 
Out[200]: 
    a b c 
0 4 4 0 
1 3 3 0 
2 4 3 3 
3 3 2 0 
4 1 0 4 

In [201]: df.columns 
Out[201]: Index(['a', 'b', 'c'], dtype='object') 

In [202]: df, df.columns, df.columns.name = df.iloc[1:], df.iloc[0].astype(str), None 

In [203]: df 
Out[203]: 
    4 4 0 
1 3 3 0 
2 4 3 3 
3 3 2 0 
4 1 0 4 

In [204]: df.columns 
Out[204]: Index(['4', '4', '0'], dtype='object')