Многоиндексная таблица 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