Pandas多重索引从列创建

3

I have a dataframe like this:

          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

我需要这样做以便将数据通过一些回归模型。由于我是新手,因此Pandas文档中的多级索引对我来说非常令人困惑。

谢谢!
4个回答

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

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

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

1
我也喜欢这个。 - piRSquared
这个很好用,但我需要按照其他示例排序输出(即来自A列的所有值后跟来自B列的值)。 - Michele Ng
谢谢,离目标又近了一步 :) 数据现在按照多重索引的第一个参数排序了,但是它并没有按照第二个参数(日期)排序,你知道如何解决吗?(例如,在输出系列中,所有a值都没有按照日期排序) - Michele Ng
1
排序索引实际上使用了两个索引级别进行排序,如果您想按独立级别排序,可以指定应对该框架进行排序的级别 :-) @MicheleNg - Naga kiran

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接