Невозможно найти подобную проблему. Скажем, я grouped_price с Multiindex (City, Month), который выглядит так:
City Month Price Sales
LA 2017-01 10 10
2017-02 15 20
2017-05 20 35
2017-07 25 40
NY 2017-01 10 5
2017-03 15 30
2017-05 20 40
2017-06 25 45
CH 2017-01 7 10
2017-02 11 22
2017-07 30 41
OL 2017-01 9 10
2017-02 17 10
2017-05 20 30
2017-07 25 41
2017-08 30 47
Итак, для "нормального" цикла заказа City → Month я сделал:
Cities = grouped_price.index.levels[0]
for city in Cities:
labels = grouped_price.loc[city].index.labels
levels = grouped_price.loc[city].index.levels
Months = levels[0][labels[0]].unique() # for each City get a list of existing Months
for mon in Months:
# do things here
x = grouped_price.loc[city, mon] # ERROR here!
и это работает. Но для обратной циклы:
Months = grouped_price.index.levels[1]
Cities = grouped_price.index.levels[0]
for mon in Months:
# Here I should get the list of Cities for specific Month
for city in Cities:
# do things here
x = grouped_price.loc[city, mon] # ERROR here!
дает ошибку, поскольку в MultiIndex существуют не все пары city-mon. Я должен найти список городов для определенного месяца, пары которых существуют, но я не могу понять, как это сделать.
Cities = grouped_price.loc[:, mon] - doesn't work
PS Я знаю, что могу повернуть таблицу или сгруппировать их в обратном порядке, но я не хочу.
Одним из решений является изменение порядка уровней MultiIndex
:
df = df.swaplevel(0, 1)
При желании вы также можете отсортировать свой новый MultiIndex
. Вот минимальный пример:
df = pd.DataFrame([[0, 1, 2], [0, 2, 3], [1, 3, 4], [1, 1, 5]],
columns=['idx1', 'idx2', 'col'])
df = df.set_index(['idx1', 'idx2'])
df = df.swaplevel(0, 1).sort_index()
print(df)
idx2 idx1
1 0 2
1 5
2 0 3
3 1 4