Доступ к групповым индексам панд по второму индексу

1

Невозможно найти подобную проблему. Скажем, я 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 Я знаю, что могу повернуть таблицу или сгруппировать их в обратном порядке, но я не хочу.

Теги:
pandas
pandas-groupby
indexing
multi-index

1 ответ

1

Одним из решений является изменение порядка уровней 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
  • 0
    df.swaplevel работал! Спасибо!
  • 0
    @AntonZi, это здорово. Не стесняйтесь принять (зеленая галочка слева), если это решит вашу проблему.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню