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
3 Réponses :
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
col2 dans ce cas, utilisez dfp.columns.name = None : 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.
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
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
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
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
Taguez-le aussi avec des pandas!