现在我有一个数据帧(df)可以通过以下方式重现结构:
d = {('Control', 0, 'mean'): {'Field 1': 1.0},
('Control', 0, 'stErr'): {'Field 1': 0.0},
('Control', 0, 'stdev'): {'Field 1': 0.0},
('Control', 48, 'mean'): {'Field 1': 1.08},
('Control', 48, 'stErr'): {'Field 1': 0.01},
('Control', 48, 'stdev'): {'Field 1': 0.03},
('Test1', 0, 'mean'): {'Field 1': 1.00},
('Test1', 0, 'stErr'): {'Field 1': 0.00},
('Test1', 0, 'stdev'): {'Field 1': 0.00},
('Test1', 48, 'mean'): {'Field 1': 1.08},
('Test1', 48, 'stErr'): {'Field 1': 0.01},
('Test1', 48, 'stdev'): {'Field 1': 0.03}}
df = pd.DataFrame(d).T
我想在当前存在mean,stErr和stdev的级别向数据框添加另一个类别'ratio'。
目前索引如下:
df.index()
MultiIndex(levels=[['Control', 'Test1'], [0, 48], ['mean', 'stErr', 'stdev']],
labels=[[0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1], [0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1], [0, 1, 2, 0, 1, 2, 0, 1, 2, 0, 1, 2]])
为了澄清我想要添加类别比率的位置,我相信新数据框的索引将如下所示
df_new.index()
MultiIndex(levels=[['Control', 'Test1'], [0, 48], ['mean', 'stErr', 'stdev', 'ratio']],
labels=[[0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1], [0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1], [0, 1, 2, 0, 1, 2, 0, 1, 2, 0, 1, 2]])
答案 0 :(得分:1)
假设您有pd.MultiIndex
,mux
mux = pd.MultiIndex(
levels=[['Control', 'Test1'],
[0, 48],
['mean', 'stErr', 'stdev']],
labels=[[0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1],
[0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1],
[0, 2, 1, 0, 2, 1, 0, 2, 1, 0, 2, 1]],
names=['device', 'interval', None])
您可以使用set_levels
mux.set_levels(['mean', 'stErr', 'stdev', 'ratio'], level=2, inplace=True)
但是你需要跟进设置标签。
这是一种可疑的方式。
mux = mux.to_series().unstack([0, 1]) \
.append(pd.Series(None, name='ratio')) \
.unstack().index