Python Pandas Pivot Table - 将计算列添加到多索引列

时间:2016-04-08 15:11:47

标签: python pandas pivot-table

对于索引和列,我有以下数据透视表,它是一个多索引:

Category        HF                      DA      
                tafp    tap     tw      tafp    tap     tafp
ATTR    EL                      
attr1   1.0     10      25      15      100     150     50
attr2   2.0     0       0       0       40      70      30
        3.0     20      50      30      0       0       0
attr3   2.0     0       0       0       0       0       0

这是此数据透视表的一个字典(值有点不同,但这无关紧要):

{
('HF', 'tafp'): {('attr1', '1.0'): 10, ('attr2', '2.0'): 100, ('attr3','2.0'): 0, ('attr4', '2.0'): 0, ('attr2', '3.0'): 71},
('HF', 'tap'): {('attr1', '1.0'): 30, ('attr2', '2.0'): 350, ('attr3', '2.0'): 0, ('attr4', '2.0'): 0, ('attr2', '3.0'): 1042},
('HF', 'tw'): {('attr1', '1.0'): 20, ('attr2', '2.0'): 250, ('attr3', '2.0'): 0, ('attr4', '2.0'): 0, ('attr2', '3.0'): 971},
('DA', 'tafp'): {('attr1', '1.0'): 0, ('attr2', '2.0'): 435, ('attr3', '2.0'): 0, ('attr4', '2.0'): 0, ('attr2', '3.0'): 0},
('DA', 'tap'): {('attr1', '1.0'): 0, ('attr2', '2.0'): 635, ('attr3', '2.0'): 0, ('attr4', '2.0'): 0, ('attr2', '3.0'): 0},
('DA', 'tw'): {('attr1', '1.0'): 0, ('attr2', '2.0'): 200, ('attr3', '2.0'): 0, ('attr4', '2.0'): 0, ('attr2', '3.0'): 0}
}

我最终想要得到的是以下内容:

Category        HF                      DA      
                tafp/tap    tw      tafp/tap    tafp
ATTR    EL                      
attr1   1.0     0.67        15      0.67        50
attr2   2.0     0           0       0.57        30
        3.0     0.67        30      0           0
attr3   2.0     0           0       0           0

所以我想得到tafp / tap的百分比,只保留这个计算列,即删除原始列。

有人知道如何实现这一目标吗?

非常感谢任何帮助:)

1 个答案:

答案 0 :(得分:3)

在某些步骤中。

第一个堆叠级别0 ('DA,HF')让级别1 ('tafp','tap')作为列,以便于处理。

df=df.stack(level=0)
"""
              tafp   tap   tw
attr1 1.0 DA     0     0    0
          HF    10    30   20
attr2 2.0 DA   435   635  200
          HF   100   350  250
      3.0 DA     0     0    0
          HF    71  1042  971
attr3 2.0 DA     0     0    0
          HF     0     0    0
attr4 2.0 DA     0     0    0
          HF     0     0    0
"""

然后操作:

valid=df.tap>0
df.tafp[valid] /= df.tap[valid]

最后重新格式化:

df=df.drop('tap',axis=1).unstack()
df.reorder_levels([1,0],axis=1).sort_index(axis=1)

for:

"""
                 DA             HF     
               tafp   tw      tafp   tw
attr1 1.0  0.000000    0  0.333333   20
attr2 2.0  0.685039  200  0.285714  250
      3.0  0.000000    0  0.068138  971
attr3 2.0  0.000000    0  0.000000    0
attr4 2.0  0.000000    0  0.000000    0
"""