web-dev-qa-db-fra.com

Remodeler large à long en pandas

Supposons que j'ai la trame de données suivante dans les pandas:

             AA  BB  CC     
   date
   05/03     1   2   3  
   06/03     4   5   6  
   07/03     7   8   9  
   08/03     5   7   1  

et je veux le transformer comme suit:

   AA 05/03    1
   AA 06/03    4
   AA 07/03    7
   AA 08/03    5
   BB 05/03    2
   BB 06/03    5
   BB 07/03    8
   BB 08/03    7
   CC 05/03    3
   CC 06/03    6
   CC 07/03    9
   CC 08/03    1

Comment puis-je le faire?

La raison de la transformation de large à longue est que, dans l'étape suivante, je voudrais fusionner cette trame de données avec une autre, en fonction des dates et des noms de colonne initiaux (AA, BB, CC).

15
km1234

unstack renvoie une série avec un multi-index:

    In [38]: df.unstack()
    Out[38]: 
        date 
    AA  05/03    1
        06/03    4
        07/03    7
        08/03    5
    BB  05/03    2
        06/03    5
        07/03    8
        08/03    7
    CC  05/03    3
        06/03    6
        07/03    9
        08/03    1
    dtype: int64

Vous pouvez appeler reset_index sur la série de retour:

In [39]: df.unstack().reset_index() 
Out[39]:        

    level_0 date    0
0   AA      05-03   1
1   AA      06-03   4
2   AA      07-03   7
3   AA      08-03   5
4   BB      05-03   2
5   BB      06-03   5
6   BB      07-03   8
7   BB      08-03   7
8   CC      05-03   3
9   CC      06-03   6
10  CC      07-03   9
11  CC      08-03   1

Ou construisez une trame de données avec un multi-index:

In [40]: pd.DataFrame(df.unstack())     
Out[40]:        

            0
    date    
AA  05-03   1
    06-03   4
    07-03   7
    08-03   5
BB  05-03   2
    06-03   5
    07-03   8
    08-03   7
CC  05-03   3
    06-03   6
    07-03   9
    08-03   1
20
ayhan

Utilisez pandas.melt pour passer du large au long:

df = pd.DataFrame({
    'date' : ['05/03', '06/03', '07/03', '08/03'],
    'AA' : [1, 4, 7, 5],
    'BB' : [2, 5, 8, 7],
    'CC' : [3, 6, 9, 1]
}).set_index('date')
df

        AA  BB  CC
date            
05/03   1   2   3
06/03   4   5   6
07/03   7   8   9
08/03   5   7   1

Pour convertir, il suffit de réinitialiser l'index puis de fondre:

df = df.reset_index()
pd.melt(df, id_vars='date', value_vars=['AA', 'BB', 'CC'])

c'est le résultat final:

    date variable value
0   05/03   AA  1
1   06/03   AA  4
2   07/03   AA  7
3   08/03   AA  5
4   05/03   BB  2
5   06/03   BB  5
6   07/03   BB  8
7   08/03   BB  7
8   05/03   CC  3
9   06/03   CC  6
10  07/03   CC  9
11  08/03   CC  1
7
George Liu