Ho un DataFrame multiindice creato tramite un'operazione di gruppo. Sto cercando di fare un ordinamento composto utilizzando diversi livelli dell'indice, ma non riesco a trovare una funzione di ordinamento che faccia ciò di cui ho bisogno.Ordinamento multiindice in panda
set di dati iniziale simile a questa (quotidiane conteggi di vendita dei vari prodotti):
Date Manufacturer Product Name Product Launch Date Sales
0 2013-01-01 Apple iPod 2001-10-23 12
1 2013-01-01 Apple iPad 2010-04-03 13
2 2013-01-01 Samsung Galaxy 2009-04-27 14
3 2013-01-01 Samsung Galaxy Tab 2010-09-02 15
4 2013-01-02 Apple iPod 2001-10-23 22
5 2013-01-02 Apple iPad 2010-04-03 17
6 2013-01-02 Samsung Galaxy 2009-04-27 10
7 2013-01-02 Samsung Galaxy Tab 2010-09-02 7
Io uso groupby per ottenere una somma sopra l'intervallo di date:
> grouped = df.groupby(['Manufacturer', 'Product Name', 'Product Launch Date']).sum()
Sales
Manufacturer Product Name Product Launch Date
Apple iPad 2010-04-03 30
iPod 2001-10-23 34
Samsung Galaxy 2009-04-27 24
Galaxy Tab 2010-09-02 22
Fin qui tutto bene!
Ora l'ultima cosa che voglio fare è una sorta di prodotti di ogni costruttore in base alla data di lancio, ma tenerli raggruppati gerarchicamente sotto produttore - qui è tutto quello che sto cercando di fare:
Sales
Manufacturer Product Name Product Launch Date
Apple iPod 2001-10-23 34
iPad 2010-04-03 30
Samsung Galaxy 2009-04-27 24
Galaxy Tab 2010-09-02 22
Quando provo sortlevel() perdo la bella gerarchia per-azienda che avevo prima:
> grouped.sortlevel('Product Launch Date')
Sales
Manufacturer Product Name Product Launch Date
Apple iPod 2001-10-23 34
Samsung Galaxy 2009-04-27 24
Apple iPad 2010-04-03 30
Samsung Galaxy Tab 2010-09-02 22
sort() e sort_index() appena venga meno
grouped.sort(['Manufacturer','Product Launch Date'])
KeyError: u'no item named Manufacturer'
grouped.sort_index(by=['Manufacturer','Product Launch Date'])
KeyError: u'no item named Manufacturer'
Sembra un'operazione semplice, ma non riesco a capirlo.
Non sono legato all'utilizzo di un MultiIndex per questo, ma poiché questo è ciò che restituisce groupby(), è quello con cui ho lavorato.
BTW il codice per produrre il dataframe iniziale è:
data = {
'Date': ['2013-01-01', '2013-01-01', '2013-01-01', '2013-01-01', '2013-01-02', '2013-01-02', '2013-01-02', '2013-01-02'],
'Manufacturer' : ['Apple', 'Apple', 'Samsung', 'Samsung', 'Apple', 'Apple', 'Samsung', 'Samsung',],
'Product Name' : ['iPod', 'iPad', 'Galaxy', 'Galaxy Tab', 'iPod', 'iPad', 'Galaxy', 'Galaxy Tab'],
'Product Launch Date' : ['2001-10-23', '2010-04-03', '2009-04-27', '2010-09-02','2001-10-23', '2010-04-03', '2009-04-27', '2010-09-02'],
'Sales' : [12, 13, 14, 15, 22, 17, 10, 7]
}
df = DataFrame(data, columns=['Date', 'Manufacturer', 'Product Name', 'Product Launch Date', 'Sales'])
"I dati saranno ordinati lessicograficamente per il livello scelto * seguito dagli altri livelli (in ordine) *" (che fa schifo ...) –