Представьте, что у нас есть 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