Aplatir DataFrame avec multi-colonnes d'index
Je voudrais convertir une Pandas DataFrame qui est dérivée à partir d'un tableau croisé dynamique dans une rangée de la représentation comme indiqué ci-dessous.
C'est là où j'en suis:
import pandas as pd
import numpy as np
df = pd.DataFrame({
'goods': ['a', 'a', 'b', 'b', 'b'],
'stock': [5, 10, 30, 40, 10],
'category': ['c1', 'c2', 'c1', 'c2', 'c1'],
'date': pd.to_datetime(['2014-01-01', '2014-02-01', '2014-01-06', '2014-02-09', '2014-03-09'])
})
# we don't care about year in this example
df['month'] = df['date'].map(lambda x: x.month)
piv = df.pivot_table(["stock"], "month", ["goods", "category"], aggfunc="sum")
piv = piv.reindex(np.arange(piv.index[0], piv.index[-1] + 1))
piv = piv.ffill(axis=0)
piv = piv.fillna(0)
print piv
qui résultats dans
stock
goods a b
category c1 c2 c1 c2
month
1 5 0 30 0
2 5 10 30 40
3 5 10 10 40
Et c'est là que je veux faire.
goods category month stock
a c1 1 5
a c1 2 0
a c1 3 0
a c2 1 0
a c2 2 10
a c2 3 0
b c1 1 30
b c1 2 0
b c1 3 10
b c2 1 0
b c2 2 40
b c2 3 0
Auparavant, J'ai utilisé
piv = piv.stack()
piv = piv.reset_index()
print piv
pour se débarrasser de la multi-index, mais cette résultats dans ce parce que j'ai croisé dynamique maintenant sur deux colonnes (["goods", "category"]
):
month category stock
goods a b
0 1 c1 5 30
1 1 c2 0 0
2 2 c1 5 30
3 2 c2 10 40
4 3 c1 5 10
5 3 c2 10 40
Personne ne sait comment je peux me débarrasser de la multi-index dans la colonne et obtenir le résultat dans un DataFrame de l'illustré format?
OriginalL'auteur orange | 2014-12-20
Vous devez vous connecter pour publier un commentaire.
puis tous vous avez besoin est de changer la dernière colonne nom de
0
àstock
.Merci. Il fonctionne très bien avec mon exemple. Cependant, je n'arrive pas à comprendre pourquoi l'utilisation de
stack
déjà travaillé et maintenant, je doit utiliserunstack
.OriginalL'auteur behzad.nouri
Il me semble que
faire fondre
(aka unpivot) est très proche de ce que vous voulez faire:Il y a un voleur colonne (stock), qui apparaît ici que l'en-tête de colonne est constante dans les piv. Si nous arrêtons d'abord la fonte des œuvres OOTB:
Edit: au-dessus de La baisse de l'indice, vous avez besoin de faire une colonne avec
reset_index
:l'indice semble être tombé, laissant cette réponse ici qu'il pourrait être utile à certains (j'espère que je peux le fixer!).
Vous pensez que c'est un bug ou est-ce à dessein?
Je ne dirais pas que c'est un bug, mais peut-être une fonction/d'amélioration (pour ne pas drop index). Aussi, vous ne pouvez pas passer des choses comme
col_level=[1, 2]
qui serait utile ici.Merci quand même. Je garde un oeil sur cette fonction pour l'utiliser dans le futur.
OriginalL'auteur Andy Hayden