Pandas转向多索引表,没有聚合

时间:2018-01-11 06:50:15

标签: python pandas dataframe pivot multi-index

我有一个带有多索引的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的每一个组合,但是我能得到的最接近的是一个非常短的表,当我想要实际维护最终的列数时,所有内容都会奇怪地聚合在一起。聚合)。

1 个答案:

答案 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