【问题标题】:Pandas pivot multi-index table with no aggregation [duplicate]没有聚合的 Pandas 透视多索引表[重复]
【发布时间】:2018-06-20 10:36:32
【问题描述】:

我有一个带有多索引的 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' 列实际上最终是一个字符串。有任何想法吗?我觉得我已经尝试了奇怪的枢轴/堆栈/取消堆栈/重新索引的每一种组合,但是我能得到的最接近的是一个非常短的表格,当我想要实际维护最终列号时,所有内容都会奇怪地聚合下来(不聚合)。

【问题讨论】:

  • df.unstack(-1)
  • @COLDSPEED 哎呀,我以为我试过了。谢谢!
  • @peur - 所以只需要df.unstack(-1) 吗?不需要rename ?
  • @jezrael 我对unstack 感到很困惑,但rename 也很有帮助
  • @peur - 我问它是因为从你的问题中我知道你也需要rename。所以这不是骗人的。但是如果只需要unstack,请不要接受并删除您的问题,因为是骗人的。

标签: python pandas dataframe pivot multi-index


【解决方案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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-05-14
    • 1970-01-01
    • 2020-08-31
    • 1970-01-01
    • 2018-11-27
    • 2020-10-17
    • 2019-10-14
    • 2020-08-30
    相关资源
    最近更新 更多