1
votes

Résumé Python avec valeur de ligne à colonne

J'ai l'entrée ci-dessous

Col1.  Wk1 Wk2 Wk3 wk4 wk5 difflast
AA.    10.  0.  0.  5.  10.  5
BB.     0.  30. 0.  0.   0.  0
CC.     0.  0.  5.  0.   0.  0
DD.     0.  0.  0.  20.  0.  -20 

Je veux la sortie en utilisant pandas ou n'importe quel paquet python comme ci-dessous

Col1  col2   col3
AA.   Wk1.   10
BB.   Wk2.   30
CC.   Wk3.   5
DD.   Wk4.   20
AA.   Wk4.   5
AA.   Wk5.   10 

Si la semaine est ajouté alors cela devrait prendre la différence des deux dernières semaines n sortie comme ci-dessus ... Besoin d'aide


1 commentaires

Taguez-le aussi avec des pandas!


3 Réponses :


1
votes

IIUC, nous pouvons utiliser groupby et unstack puis diff () tout en utilisant sélectivement le découpage de liste pour obtenir les deux dernières colonnes.

s = df.groupby(['Col1','col2']).agg('sum').unstack(1)\
      .fillna(0).droplevel(0,1)\
       .reset_index()


s['difflast'] = s.iloc[:,-2:].diff(axis=1).iloc[:,-1]

print(s)
col2 Col1  Wk1.  Wk2.  Wk3.  Wk4.  Wk5.  difflast
0     AA.  10.0   0.0   0.0   5.0  10.0       5.0
1     BB.   0.0  30.0   0.0   0.0   0.0       0.0
2     CC.   0.0   0.0   5.0   0.0   0.0       0.0
3     DD.   0.0   0.0   0.0  20.0   0.0     -20.0


0 commentaires

2
votes
  • Utilisez pandas.DataFrame.pivot , qui permet de passer du format long au format large.
    • Si vous ne voulez pas que les colonnes soient nommées, col2 dans ce cas, utilisez dfp.columns.name = None
  • Soustrayez les deux dernières colonnes à l'aide de .iloc .
    • Dans ce cas, : obtient toutes les lignes
    • -1 obtient la dernière colonne et -2 l’avant-dernière colonne.
  • .mean (axe = 1) prend la moyenne par ligne. 0 sont inclus dans le calcul.
    • iloc [:, -1] récupère la dernière colonne uniquement
      • -1 est toujours la dernière colonne, -2 est l'avant-dernière, et ainsi de suite.
    • .iloc [:, 0: -1] récupère toutes les colonnes sauf la dernière colonne.
      • Tout comme le découpage régulier, lors de la sélection d'une plage 0: -1 , la dernière valeur n'est pas incluse.
  • dfp['last - avg'] = dfp.iloc[:, -1] - dfp.iloc[:, 0:-1].mean(axis=1)
    
    col2  Wk1.  Wk2.  Wk3.  Wk4.  Wk5.  last - avg
    Col1                                          
    AA.   10.0   0.0   0.0   5.0  10.0        6.25
    BB.    0.0  30.0   0.0   0.0   0.0       -7.50
    CC.    0.0   0.0   5.0   0.0   0.0       -1.25
    DD.    0.0   0.0   0.0  20.0   0.0       -5.00
    

    Avec difflast - soustrayez Wk5 de la moyenne des semaines précédentes

    dfp['last - avg'] = dfp.iloc[:, -2] - dfp.iloc[:, 0:-2].mean(axis=1)
    
    col2  Wk1.  Wk2.  Wk3.  Wk4.  Wk5.  difflast  last - avg
    Col1                                                    
    AA.   10.0   0.0   0.0   5.0  10.0       5.0        6.25
    BB.    0.0  30.0   0.0   0.0   0.0       0.0       -7.50
    CC.    0.0   0.0   5.0   0.0   0.0       0.0       -1.25
    DD.    0.0   0.0   0.0  20.0   0.0     -20.0       -5.00
    

    Sans difflast - soustrayez Wk5 de la moyenne des semaines précédentes

    dfp = df.pivot(index='Col1', columns='col2', values='col3').fillna(0)
    
    col2  Wk1.  Wk2.  Wk3.  Wk4.  Wk5.
    Col1                              
    AA.   10.0   0.0   0.0   5.0  10.0
    BB.    0.0  30.0   0.0   0.0   0.0
    CC.    0.0   0.0   5.0   0.0   0.0
    DD.    0.0   0.0   0.0  20.0   0.0
    
    # take difference
    dfp['difflast'] = dfp.iloc[:, -1] - dfp.iloc[:, -2]
    
    col2  Wk1.  Wk2.  Wk3.  Wk4.  Wk5.  difflast
    Col1                                        
    AA.   10.0   0.0   0.0   5.0  10.0       5.0
    BB.    0.0  30.0   0.0   0.0   0.0       0.0
    CC.    0.0   0.0   5.0   0.0   0.0       0.0
    DD.    0.0   0.0   0.0  20.0   0.0     -20.0
    

0 commentaires

1
votes

Vous pouvez utiliser df.unstack

(df.set_index(['Col1', 'col2'])['col3'].unstack(fill_value=0).
    assign(d = lambda x: x['Wk5.'] - x['Wk4.']))

col2  Wk1.  Wk2.  Wk3.  Wk4.  Wk5.   d
Col1
AA.     10     0     0     5    10   5
BB.      0    30     0     0     0   0
CC.      0     0     5     0     0   0
DD.      0     0     0    20     0 -20


0 commentaires