将类别添加到pandas multiIndex数据帧级别

时间:2016-11-04 21:00:21

标签: python python-3.x pandas

现在我有一个数据帧(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]])

1 个答案:

答案 0 :(得分:1)

假设您有pd.MultiIndexmux

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