Использование idxmax на иерархическом фрейме данных - PullRequest
0 голосов
/ 17 октября 2018

Я пытаюсь найти индекс максимальных значений в нескольких столбцах в мультииндексном фрейме данных 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 (как было предложено в предыдущем посте по multi-index- Получение максимальных значений от панд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)

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

Ответы [ 2 ]

0 голосов
/ 17 октября 2018

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

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 голосов
/ 17 октября 2018

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

Одним из решений является извлечение второго элемента каждого 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))
...