我有一个这样的数据框:
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
我需要这种方式来通过一些回归模型运行数据。不幸的是,关于多索引的熊猫文档对我来说很困惑,因为我是新来的。 谢谢!
答案 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