我有一个带有多索引的pandas数据帧,其中已经计算了几个groupby聚合。我正在尝试将最终的分组列转换为标题,而不进行任何聚合。我已经设法通过聚合完成它,但似乎无法弄清楚如何简单地转置它,以便第二列成为标题,最后一列成为每个标题下的值。
一个类似的例子:
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
我应该注意,由于额外的计算,'Accuracy'列实际上最终成为一个字符串。有任何想法吗?我觉得我已经尝试了奇怪的pivot / stack / unstack / re-index的每一个组合,但是我能得到的最接近的是一个非常短的表,当我想要实际维护最终的列数时,所有内容都会奇怪地聚合在一起。聚合)。
答案 0 :(得分: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