Pandas - Concat разных уровней столбцов MultiIndex DataFrames - PullRequest
0 голосов
/ 30 октября 2018

Представьте, что у нас есть 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...