Chciałbym uruchomić oś na pandach DataFrame
, z indeksem będącym dwiema kolumnami, a nie jedną. Na przykład jedno pole na rok, jedno na miesiąc, pole "element", które pokazuje "element 1" i "element 2" oraz pole "wartości" z wartościami liczbowymi. Chcę, żeby indeks był rok + miesiąc.pandy: jak uruchomić oś z multi-indeksem?
Jedynym sposobem, w jaki udało mi się to osiągnąć, było połączenie dwóch pól w jeden, a następnie ponowne ich oddzielenie. czy istnieje lepszy sposób?
Minimalny kod skopiowany poniżej. Wielkie dzięki!
PS Tak, zdaję sobie sprawę, że są inne pytania związane ze słowami kluczowymi "pivot" i "multi-index", ale nie rozumiałem, czy/jak mogą mi pomóc w tym pytaniu.
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
Podałem kilka szczegółowych przykładów i alternatywnych podejść w tym [** Q & A **] (https://stackoverflow.com/q/47152691/2336654) – piRSquared