Использование idxmax на иерархическом фрейме данных

1

Я пытаюсь найти индекс максимальных значений в нескольких столбцах в многоиндексном кадре данных Pandas.

        Kommune  Upplands  Vallentuna...   Kiruna
Year    Party  
1973    M        0.9       29.2      ...   20     
        KD       15        10        ...   2 
        MP       1.1       4         ...   5     
        V        6         7         ...   8  
        SD       NaN       NaN       ...   NaN
        L        10.1      13.5      ...   8.8 
1976    M        1.8       29.2      ...   20     
        KD       16        10        ...   2 
        MP       10        4         ...   5     
        V        15        7         ...   8    
        SD       NaN       NaN       ...   NaN
        L        11.9      15        ...   18
...     ...      ...       ...       ...   ... 
...     ...      ...       ...       ...   ... 
2014    M        28        22        ...   29     
        KD       4.5       13        ...   5 
        MP       11        8         ...   9     
        V        1.9       5         ...   10    
        SD       20        10        ...   5
        L        19        25        ...   1

Желаемый результат

Kommune  Upplands  Vallentuna...   Kiruna
Year      
1973     KD        M         ...   M
1976     V         M         ...   M
...      ...       ...       ...   ...
2014     M         L         ...   M  

Я пробовал использовать groupby (как было предложено в предыдущем сообщении о мультииндексе - получение максимальных значений из pandas multiindex dataframe), но он возвращает кортеж для каждой позиции.

Kommune  Upplands          Vallentuna        ...   Kiruna
Year      
1973     (1973, KD)        (1973, M)         ...   (1973, M)
1976     (1976, V)         (1976, M)         ...   (1976, M)
...      ...               ...               ...   ...
2014     (2014, M)         (2014, L)         ...   (2014, M)

Как получить только второй элемент из каждого кортежа? Или есть более эффективный способ найти индексы?

Теги:
pandas
multi-index

2 ответа

2
Лучший ответ

Похоже, вам нужно

df.stack().sort_values().groupby(level=[0,2]).tail(1).reset_index(level=1).Party.unstack()
Out[544]: 
     Upplands Vallentuna Kiruna
Year                           
1973       KD          M      M
1976       KD          M      M
0

Как получить только второй элемент из каждого кортежа?

Одним из решений является извлечение второго элемента каждого tuple через pd.DataFrame.applymap:

df = pd.DataFrame([[(1, 2), (3, 4)], [(5, 6), (7, 8)]])

res = df.applymap(lambda x: x[1])

print(res)

   0  1
0  2  4
1  6  8

Или используйте функциональную альтернативу:

from operator import itemgetter

res = df.applymap(itemgetter(1))

Ещё вопросы

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