熊猫-Concat不同列级别的MultiIndex DataFrames

时间:2018-10-30 13:50:01

标签: python pandas dataframe

想象一下,我们有一个这样创建的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

0 个答案:

没有答案