Python 从列创建多个索引
我有这样一个数据帧:Python 从列创建多个索引,python,pandas,multi-index,Python,Pandas,Multi Index,我有这样一个数据帧: 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)
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
我需要用这种方法通过一些回归模型来运行数据。不幸的是,关于多索引的熊猫文档对我来说非常混乱,因为我是新手。
谢谢大家! 您需要将索引重置两次,然后只需执行
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
理解力
稍微不同的方式
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
您可以尝试获取列的分类代码,然后堆叠索引并将索引聚合到元组
df.columns = df.columns.to_series().astype('category').cat.codes
df1 = df.stack().reorder_levels([1,0]).sort_index()
df1.index = tuple(df1.index)
输出:
**编辑**
根据索引级别对数据进行排序
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)
输出:
我喜欢这个tooThis非常好,除了我需要像其他示例一样对输出进行排序(A列中的所有值后跟B列中的值,更近一步:)数据现在按照多索引的第一个参数进行排序,但是它没有按照第二个参数(日期)进行排序,您知道如何解决这个问题吗?(例如,在输出系列中,所有a值都不是按日期排序的)排序索引实际上使用两个索引级别进行排序,如果要在单个级别上进行排序,可以指定帧应排序的级别:-)@MicheleNg
(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