我有一个空的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 ...我提前知道第一级的所有可能值。
答案 0 :(得分:2)
如果您希望一次构建多索引DF
一列,则可以附加帧并删除引入的Nan's
,并为您留下所需的多索引{{1}如图所示:
<强> 演示: 强>
DF
一次取一列并构建相应的标题。
df = pd.DataFrame()
df['foo', 'bar'] = [1,2,3]
df['foo', 'baz'] = [3,4,5]
df
由于产生了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。