如何将已分层命名的列添加到Pandas DataFrame

时间:2016-11-03 03:06:32

标签: python pandas dataframe hierarchical-data multi-index

我有一个空的DataFrame:

import pandas as pd
df = pd.DataFrame()

我想添加一个分层命名的列。我试过这个:

df['foo', 'bar'] = [1,2,3]

但它提供了一个名称为元组的列:

   (foo, bar)
0           1
1           2
2           3

我想要这个:

  foo
  bar
0   1
1   2
2   3

如果我以这种方式构建全新的DataFrame,我可以获得:

pd.DataFrame([1,2,3], columns=pd.MultiIndex.from_tuples([('foo', 'bar')]))

在向现有DataFrame添加新列时,如何创建此类布局?级别数总是2 ...我提前知道第一级的所有可能值。

2 个答案:

答案 0 :(得分:2)

如果您希望一次构建多索引DF一列,则可以附加帧并删除引入的Nan's,并为您留下所需的多索引{{1}如图所示:

<强> 演示:

DF

Image

一次取一列并构建相应的标题。

df = pd.DataFrame()
df['foo', 'bar'] = [1,2,3]
df['foo', 'baz'] = [3,4,5]
df

Image

由于产生了pd.concat([df[[0]], df[[1]]]).apply(lambda x: x.dropna()) ,因此将值转换为float dtype,可以在Nans的帮助下将其重新转换为整数。

<强> 注意:

这假设在连接期间级别数匹配。

答案 1 :(得分:0)

我不确定是否有办法摆脱这种情况,而无需将列的索引重新定义为Multiindex。如果我没有弄错,MultiIndex类的级别实际上由Index对象组成。虽然您可以使用具有一个或多个级别值的分层索引的DataFrame,但索引对象本身仍必须是MultiIndex。例如:

In [2]: df = pd.DataFrame({'foo': [1,2,3], 'bar': [4,5,6]})

In [3]: df
Out[3]:
   bar  foo
0    4    1
1    5    2
2    6    3

In [4]: df.columns
Out[4]: Index([u'bar', u'foo'], dtype='object')

In [5]: df.columns = pd.MultiIndex.from_tuples([('', 'foo'), ('foo','bar')])

In [6]: df.columns
Out[6]:
MultiIndex(levels=[[u'', u'foo'], [u'bar', u'foo']], 
           labels=[[0, 1], [1, 0]])

In [7]: df.columns.get_level_values(0)
Out[7]: Index([u'', u'foo'], dtype='object')

In [8]: df
Out[8]:
      foo
  foo bar
0   4   1
1   5   2
2   6   3

In [9]: df['bar', 'baz'] = [7,8,9]

In [10]: df
Out[10]:
      foo bar
  foo bar baz
0   4   1   7
1   5   2   8
2   6   3   9

正如您所看到的,一旦MultiIndex到位,您可以按照您的想法添加列,但遗憾的是我不知道有任何方法强制DataFrame自适应地采用MultiIndex。