Многоиндексная таблица Pandas Pivot без агрегации

У меня есть pandas dataframe с мультииндексом, где несколько групповых агрегаций уже были вычислены. Я пытаюсь объединить последний сгруппированный столбец в заголовки без агрегирования. Мне удалось сделать это с помощью агрегации, но я не могу понять, как просто перенести это так, чтобы 2-й последний столбец стал заголовком, а последний столбец стал значением под каждым заголовком.

Аналогичный пример:

df = pd.DataFrame.from_dict(
   {'Classifier':['SVM']*6 + ['CNN']*6,
    'Preprocess': (['None']*3 + ['PCA']*3)*2,
    'Group': ([1]*2 + [2]*2)*3,
    'Fold': ([1] + [2])*6,
    'Accuracy': np.random.rand((12))
    })
df = df.groupby(['Classifier', 'Preprocess', 'Group']).agg({'Accuracy': 'mean'})
print df
                             Accuracy
Classifier Preprocess Group          
CNN        None       1      0.912794
                      2      0.514453
           PCA        1      0.694035
                      2      0.740769
SVM        None       1      0.235105
                      2      0.817883
           PCA        1      0.567313
                      2      0.657962

Я пытаюсь заставить его выглядеть примерно так:

                      Accuracy - Group
Classifier Preprocess 1         2        
CNN        None       0.912794  0.514453              
           PCA        0.694035  0.740769
SVM        None       0.235105  0.817883
           PCA        0.567313  0.657962

Должен отметить, что столбец "Точность" фактически является строкой из-за дополнительных вычислений. Есть идеи? Я чувствую, что пробовал каждую комбинацию странных сводок / стеков / стеков / переиндексаций, но самое близкое, что я могу получить, - это очень короткая таблица, где все странным образом агрегируется, когда я хочу фактически сохранить окончательные номера столбцов (нет агрегация).

1 ответ

Решение

Я думаю тебе нужно unstack + rename:

print (df.unstack().rename(columns=lambda x: x + ' - '+ df.index.names[-1], level=0))
                      Accuracy - Group          
Group                                1         2
Classifier Preprocess                           
CNN        None               0.879696  0.644665
           PCA                0.613153  0.502952
SVM        None               0.589627  0.323793
           PCA                0.619407  0.356250

Альтернатива:

df1 = df.unstack().rename(columns=lambda x: '{} - {}'.format(x, df.index.names[-1]), level=0)
print (df1)
                      Accuracy - Group          
Group                                1         2
Classifier Preprocess                           
CNN        None               0.376257  0.531367
           PCA                0.058679  0.064388
SVM        None               0.630307  0.908984
           PCA                0.312942  0.895200

Деталь:

print (df.index.names)
['Classifier', 'Preprocess', 'Group']

print (df.index.names[-1])
Group

print (df.unstack())
                       Accuracy          
Group                         1         2
Classifier Preprocess                    
CNN        None        0.376257  0.531367
           PCA         0.058679  0.064388
SVM        None        0.630307  0.908984
           PCA         0.312942  0.895200
Другие вопросы по тегам