想象一下,我们有一个这样创建的DataFrame:
tmp_df = pd.DataFrame(index=xrange(10), columns=['3-1','3-2'])
tmp_df = pd.concat({'2-1': tmp_df, '2-2': tmp_df},axis=1)
tmp_df = pd.concat({'1-1': tmp_df, '1-2': tmp_df}, axis=1)
哪个给:
1-1 1-2
2-1 2-2 2-1 2-2
3-1 3-2 3-1 3-2 3-1 3-2 3-1 3-2
0 NaN NaN NaN NaN NaN NaN NaN NaN
1 NaN NaN NaN NaN NaN NaN NaN NaN
2 NaN NaN NaN NaN NaN NaN NaN NaN
3 NaN NaN NaN NaN NaN NaN NaN NaN
4 NaN NaN NaN NaN NaN NaN NaN NaN
5 NaN NaN NaN NaN NaN NaN NaN NaN
6 NaN NaN NaN NaN NaN NaN NaN NaN
7 NaN NaN NaN NaN NaN NaN NaN NaN
8 NaN NaN NaN NaN NaN NaN NaN NaN
9 NaN NaN NaN NaN NaN NaN NaN NaN
因此,我们有一个三级列索引的DataFrame。尽管如此,如果我们想将此连接到另一个不同的两级列索引的DataFrame上,例如:
tmp2_df = pd.Series(np.nan,index=xrange(10))
tmp2_df = pd.concat({'1-3':pd.concat({'2-1': tmp2_df, '2-2': tmp2_df},axis=1)},axis=1)
1-3
2-1 2-2
0 NaN NaN
1 NaN NaN
2 NaN NaN
3 NaN NaN
4 NaN NaN
5 NaN NaN
6 NaN NaN
7 NaN NaN
8 NaN NaN
9 NaN NaN
使用pd.concat(...)
破坏层次结构:
pd.concat([tmp_df,tmp2_df],axis=1).columns
Index([(u'1-1', u'2-1', u'3-1'), (u'1-1', u'2-1', u'3-2'),
(u'1-1', u'2-2', u'3-1'), (u'1-1', u'2-2', u'3-2'),
(u'1-2', u'2-1', u'3-1'), (u'1-2', u'2-1', u'3-2'),
(u'1-2', u'2-2', u'3-1'), (u'1-2', u'2-2', u'3-2'),
(u'1-3', u'2-1'), (u'1-3', u'2-2')],
dtype='object')
我们如何以tmp2_df
没有第3级列索引的方式维护列索引层次结构?输出应类似于:
1-1 1-2 1-3
2-1 2-2 2-1 2-2 2-1 2-2
3-1 3-2 3-1 3-2 3-1 3-2 3-1 3-2
0 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
1 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
2 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
3 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
4 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
5 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
6 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
7 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
8 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
9 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
我知道您可以执行以下操作:
tmp_df['test'] = pd.Series(np.nan,index=xrange(10))
1-1 1-2 test
2-1 2-2 2-1 2-2
3-1 3-2 3-1 3-2 3-1 3-2 3-1 3-2
0 NaN NaN NaN NaN NaN NaN NaN NaN NaN
1 NaN NaN NaN NaN NaN NaN NaN NaN NaN
2 NaN NaN NaN NaN NaN NaN NaN NaN NaN
3 NaN NaN NaN NaN NaN NaN NaN NaN NaN
4 NaN NaN NaN NaN NaN NaN NaN NaN NaN
5 NaN NaN NaN NaN NaN NaN NaN NaN NaN
6 NaN NaN NaN NaN NaN NaN NaN NaN NaN
7 NaN NaN NaN NaN NaN NaN NaN NaN NaN
8 NaN NaN NaN NaN NaN NaN NaN NaN NaN
9 NaN NaN NaN NaN NaN NaN NaN NaN NaN
但是此解决方案不适用于追加DataFrames:
ValueError: Wrong number of items passed 2, placement implies 1