首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >pandas列的多索引

问pandas列的多索引
EN

Stack Overflow用户
提问于 2019-02-15 00:15:58
回答 4查看 108关注 0票数 3

我有一个这样的数据帧:

代码语言:javascript
复制
          index        A   B   C                  
     01.01.2000        a1  b1  c1
     01.02.2000        a2  b2  c2
     01.03.2000        a3  b3  c3

并希望得到以下信息:

代码语言:javascript
复制
              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文档让我非常困惑,因为我是新手。谢谢!

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2019-02-15 00:52:00

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

代码语言:javascript
复制
df.columns = df.columns.to_series().astype('category').cat.codes
df1 = df.stack().reorder_levels([1,0]).sort_index()
df1.index = tuple(df1.index)

输出:

代码语言:javascript
复制
(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

**编辑**

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

代码语言:javascript
复制
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)

输出:

代码语言:javascript
复制
(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
EN

Stack Overflow用户

发布于 2019-02-15 00:26:21

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

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2019-02-15 00:30:20

理解

代码语言:javascript
复制
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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54694732

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档