列中的pandas multi索引

时间:2019-02-14 16:15:58

标签: python pandas multi-index

我有一个这样的数据框:

          index        A   B   C                  
     01.01.2000        a1  b1  c1
     01.02.2000        a2  b2  c2
     01.03.2000        a3  b3  c3

,并希望获得此信息:

              index      X
     (0, 01.01.2000)     a1
     (0, 01.02.2000)     a2
     (0, 01.03.2000)     a3
     (1, 01.01.2000)     b1
     (1, 01.02.2000)     b2
     (1, 01.03.2000)     b3
     (2, 01.01.2000)     c1
     (2, 01.02.2000)     c2
     (2, 01.03.2000)     c3

我需要这种方式来通过一些回归模型运行数据。不幸的是,关于多索引的熊猫文档对我来说很困惑,因为我是新来的。 谢谢!

4 个答案:

答案 0 :(得分:3)

您需要两次reset_index,然后才执行melt

s=df.reset_index().reset_index().melt(['level_0','index'])
yourdf=pd.DataFrame({'index':tuple(zip(s['level_0'],s['index'])),'X':s.value})
yourdf
Out[130]: 
             index   X
0  (0, 01.01.2000)  a1
1  (1, 01.02.2000)  a2
2  (2, 01.03.2000)  a3
3  (0, 01.01.2000)  b1
4  (1, 01.02.2000)  b2
5  (2, 01.03.2000)  b3
6  (0, 01.01.2000)  c1
7  (1, 01.02.2000)  c2
8  (2, 01.03.2000)  c3

答案 1 :(得分:3)

理解力

pd.DataFrame([
    [(i, idx), v]
    for i, (idx, *V) in enumerate(df.itertuples())
    for v in V
], columns=['index', 'X'])

             index   X
0  (0, 01.01.2000)  a1
1  (0, 01.01.2000)  b1
2  (0, 01.01.2000)  c1
3  (1, 01.02.2000)  a2
4  (1, 01.02.2000)  b2
5  (1, 01.02.2000)  c2
6  (2, 01.03.2000)  a3
7  (2, 01.03.2000)  b3
8  (2, 01.03.2000)  c3

答案 2 :(得分:3)

您可以尝试获取列的分类代码,然后将索引堆叠并收敛到元组

df.columns = df.columns.to_series().astype('category').cat.codes
df1 = df.stack().reorder_levels([1,0]).sort_index()
df1.index = tuple(df1.index)

出局:

(0, 01.01.2000)    a1
(0, 01.02.2000)    a2
(0, 01.03.2000)    a3
(1, 01.01.2000)    b1
(1, 01.02.2000)    b2
(1, 01.03.2000)    b3
(2, 01.01.2000)    c1
(2, 01.02.2000)    c2
(2, 01.03.2000)    c3
dtype: object

**编辑**

根据索引级别对数据进行排序

df.index  = pd.to_datetime(df.index)
df.columns = df.columns.to_series().astype('category').cat.codes
df1 = df.stack().reorder_levels([1,0]).sort_index(level=1)
df1.index = tuple(df1.index)

出局:

(0, 2000-01-01 00:00:00)    a1
(1, 2000-01-01 00:00:00)    b1
(2, 2000-01-01 00:00:00)    c1
(0, 2000-01-02 00:00:00)    a2
(1, 2000-01-02 00:00:00)    b2
(2, 2000-01-02 00:00:00)    c2
(0, 2000-01-03 00:00:00)    a3
(1, 2000-01-03 00:00:00)    b3
(2, 2000-01-03 00:00:00)    c3
dtype: object

答案 3 :(得分:2)

稍有不同的方式,

new_df = df.set_index('index', append=True).stack().droplevel(2)
new_df.index = tuple(zip(new_df.index))
new_df = new_df.reset_index().rename(columns = {'level_0': 'index', 0:'X'})

    index           X
0   (0, 01.01.2000) a1
1   (0, 01.01.2000) b1
2   (0, 01.01.2000) c1
3   (1, 01.02.2000) a2
4   (1, 01.02.2000) b2
5   (1, 01.02.2000) c2
6   (2, 01.03.2000) a3
7   (2, 01.03.2000) b3
8   (2, 01.03.2000) c3