为了账号安全,请及时绑定邮箱和手机立即绑定

来自列的熊猫多索引

来自列的熊猫多索引

偶然的你 2021-11-09 13:38:24
我有一个这样的数据框:          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我需要以这种方式通过一些回归模型运行数据。不幸的是,关于多索引的熊猫文档对我来说非常混乱,因为我是新手。谢谢!
查看完整描述

3 回答

?
30秒到达战场

TA贡献1828条经验 获得超6个赞

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


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


查看完整回答
反对 回复 2021-11-09
?
精慕HU

TA贡献1845条经验 获得超8个赞

你需要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


查看完整回答
反对 回复 2021-11-09
?
慕盖茨4494581

TA贡献1850条经验 获得超11个赞

理解

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


查看完整回答
反对 回复 2021-11-09
  • 3 回答
  • 0 关注
  • 146 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信