Python透视表-将计算列添加到多索引列
对于索引和列,我有以下透视表,这是一个多索引:Python透视表-将计算列添加到多索引列,python,pandas,pivot-table,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
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的百分比,并仅保留此计算列,即删除原始列
有人知道我怎样才能做到这一点吗
非常感谢您的帮助:在某些步骤中
第一个堆栈级别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)
用于:
非常感谢你!工作起来很有魅力。你能澄清一下stack和unstack中“level”参数的用法吗?我确实理解它的意思,但例如,为什么在取消堆叠时使用level=2?因为'HF','DA'现在是rows index的第三个index 2列,但它是默认值,所以我将其删除。
"""
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
"""