3 回答
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
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
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
添加回答
举报