Vorrei eseguire un pivot su un panda DataFrame
, con l'indice due colonne, non uno. Ad esempio, un campo per l'anno, uno per il mese, un campo "item" che mostra "item 1" e "item 2" e un campo "value" con valori numerici. Voglio che l'indice sia di anno + mese.panda: come eseguire un pivot con un multiindice?
L'unico modo in cui sono riuscito a farlo funzionare era combinare i due campi in uno, quindi separarli di nuovo. C'è un modo migliore?
Codice minimo copiato di seguito. Molte grazie!
PS Sì, sono consapevole che ci sono altre domande con le parole chiave 'pivot' e 'multi-index', ma non ho capito se/come possono aiutarmi con questa domanda.
import pandas as pd
import numpy as np
df= pd.DataFrame()
month = np.arange(1, 13)
values1 = np.random.randint(0, 100, 12)
values2 = np.random.randint(200, 300, 12)
df['month'] = np.hstack((month, month))
df['year'] = 2004
df['value'] = np.hstack((values1, values2))
df['item'] = np.hstack((np.repeat('item 1', 12), np.repeat('item 2', 12)))
# This doesn't work:
# ValueError: Wrong number of items passed 24, placement implies 2
# mypiv = df.pivot(['year', 'month'], 'item', 'value')
# This doesn't work, either:
# df.set_index(['year', 'month'], inplace=True)
# ValueError: cannot label index with a null key
# mypiv = df.pivot(columns='item', values='value')
# This below works but is not ideal:
# I have to first concatenate then separate the fields I need
df['new field'] = df['year'] * 100 + df['month']
mypiv = df.pivot('new field', 'item', 'value').reset_index()
mypiv['year'] = mypiv['new field'].apply(lambda x: int(x)/100)
mypiv['month'] = mypiv['new field'] % 100
Ho fornito diversi esempi dettagliati e approcci alternativi in questo [** D & R **] (https://stackoverflow.com/q/47152691/2336654) – piRSquared