代码之家  ›  专栏  ›  技术社区  ›  Michael

如何避免按索引对数据透视表排序

  •  1
  • Michael  · 技术社区  · 9 年前

    t1=r.data[(r.data['test_num']==2) & (r.data['el_num'] < 4)]
    
         test_num  el_num  file_num     dose  is_anneal     value   fail
    99          2       1         0    100.0      False -0.000056  False
    100         2       1         1   5052.0      False -0.000056  False
    101         2       1         2  10107.0      False -0.000056  False
    102         2       1         3  16561.0      False -0.000056  False
    103         2       1         4  22536.0      False -0.000056  False
    104         2       1         5  25020.0      False -0.000056  False
    105         2       1         6  35123.0      False -0.000056  False
    106         2       1         7     24.0       True -0.000056  False
    107         2       1         8    168.0       True -0.000055  False
    108         2       2         0    100.0      False -0.000056  False
    109         2       2         1   5052.0      False -0.000056  False
    110         2       2         2  10107.0      False -0.000056  False
    111         2       2         3  16561.0      False -0.000056  False
    112         2       2         4  22536.0      False -0.000056  False
    113         2       2         5  25020.0      False -0.000056  False
    114         2       2         6  35123.0      False -0.000056  False
    115         2       2         7     24.0       True -0.000056  False
    116         2       2         8    168.0       True -0.000055  False
    117         2       3         0    100.0      False -0.000060  False
    118         2       3         1   5052.0      False -0.000061  False
    119         2       3         2  10107.0      False -0.000061  False
    120         2       3         3  16561.0      False -0.000061  False
    121         2       3         4  22536.0      False -0.000061  False
    122         2       3         5  25020.0      False -0.000061  False
    123         2       3         6  35123.0      False -0.000061  False
    124         2       3         7     24.0       True -0.000061  False
    125         2       3         8    168.0       True -0.000061  False
    

    当我想创建透视表时,我得到了以下结果:

    print(t1.pivot(index='dose',columns='el_num',values='value'))
    
    el_num          1         2         3
    dose                                 
    24.0    -0.000056 -0.000056 -0.000061
    100.0   -0.000056 -0.000056 -0.000060
    168.0   -0.000055 -0.000055 -0.000061
    5052.0  -0.000056 -0.000056 -0.000061
    10107.0 -0.000056 -0.000056 -0.000061
    16561.0 -0.000056 -0.000056 -0.000061
    22536.0 -0.000056 -0.000056 -0.000061
    25020.0 -0.000056 -0.000056 -0.000061
    35123.0 -0.000056 -0.000056 -0.000061
    

    但是我想要 dose

    100.0
    5052.0
    10107.0
    16561.0
    22536.0
    25020.0
    35123.0
    24.0
    168.0
    

    2 回复  |  直到 9 年前
        1
  •  2
  •   jezrael    9 年前

    您可以使用类似的解决方案 pivot_table ,但如果重复,则聚合值:

    df = t1.groupby(['dose','el_num'], sort=False)['value'].mean().unstack()
    print (df)
    el_num          1         2         3
    dose                                 
    100.0   -0.000056 -0.000056 -0.000060
    5052.0  -0.000056 -0.000056 -0.000061
    10107.0 -0.000056 -0.000056 -0.000061
    16561.0 -0.000056 -0.000056 -0.000061
    22536.0 -0.000056 -0.000056 -0.000061
    25020.0 -0.000056 -0.000056 -0.000061
    35123.0 -0.000056 -0.000056 -0.000061
    24.0    -0.000056 -0.000056 -0.000061
    168.0   -0.000055 -0.000055 -0.000061
    

    另一个解决方案是使用 pivot 然后 reindex 按自定义顺序:

    a = t1.loc[t1['el_num'] == 1,'dose']
    
    df = t1.pivot(index='dose',columns='el_num',values='value').reindex(a)
    print (df)
    el_num          1         2         3
    dose                                 
    100.0   -0.000056 -0.000056 -0.000060
    5052.0  -0.000056 -0.000056 -0.000061
    10107.0 -0.000056 -0.000056 -0.000061
    16561.0 -0.000056 -0.000056 -0.000061
    22536.0 -0.000056 -0.000056 -0.000061
    25020.0 -0.000056 -0.000056 -0.000061
    35123.0 -0.000056 -0.000056 -0.000061
    24.0    -0.000056 -0.000056 -0.000061
    168.0   -0.000055 -0.000055 -0.000061
    
        2
  •  1
  •   unutbu    9 年前

    自 file_num 已按所需顺序排序,您可以使用

    (t1.set_index(['file_num','dose','el_num']['value']
       .unstack('el_num').reset_index('file_num', drop=True))
    

    这会产生

    el_num          1         2         3
    dose                                 
    100.0   -0.000056 -0.000056 -0.000060
    5052.0  -0.000056 -0.000056 -0.000061
    10107.0 -0.000056 -0.000056 -0.000061
    16561.0 -0.000056 -0.000056 -0.000061
    22536.0 -0.000056 -0.000056 -0.000061
    25020.0 -0.000056 -0.000056 -0.000061
    35123.0 -0.000056 -0.000056 -0.000061
    24.0    -0.000056 -0.000056 -0.000061
    168.0   -0.000055 -0.000055 -0.000061
    

    set_index/unstack 操作类似于数据透视,只是它允许使用多个列作为索引。 文件编号 包括以强制执行所需的行顺序。