Python 使用分层列创建DataFrame

Python 使用分层列创建DataFrame,python,pandas,Python,Pandas,使用分层列创建数据帧的最简单方法是什么 我目前正在使用以下方法从名称目录->系列创建数据帧: df=pd.DataFrame(data=series) 我希望使用相同的列名称,但在列上添加额外的层次结构。目前,我希望附加级别的列具有相同的值,比如“估计” 我正在尝试以下方法,但似乎不起作用: pd.DataFrame(data=serieses,columns=pd.MultiIndex.from_tuples([(x,“Estimates”)表示serieses.keys()中的x) 我得到的

使用分层列创建数据帧的最简单方法是什么

我目前正在使用以下方法从名称目录->
系列创建数据帧:

df=pd.DataFrame(data=series)

我希望使用相同的列名称,但在列上添加额外的层次结构。目前,我希望附加级别的列具有相同的值,比如“估计”

我正在尝试以下方法,但似乎不起作用:

pd.DataFrame(data=serieses,columns=pd.MultiIndex.from_tuples([(x,“Estimates”)表示serieses.keys()中的x)

我得到的只是一个包含所有NaN的数据帧

例如,我要找的大致是:

l1               Estimates    
l2  one  two  one  two  one  two  one  two
r1   1    2    3    4    5    6    7    8
r2   1.1  2    3    4    5    6    71   8.2

其中l1和l2是多索引的标签,我不确定,但我认为使用dict作为DF和多索引的输入不能很好地配合使用。相反,使用数组作为输入可以使其工作

我通常更喜欢dict作为输入,一种方法是在创建df后设置列:

import pandas as pd

data = {'a': [1,2,3,4], 'b': [10,20,30,40],'c': [100,200,300,400]}
df = pd.DataFrame(np.array(data.values()).T, index=['r1','r2','r3','r4'])

tups = zip(*[['Estimates']*len(data),data.keys()])

df.columns = pd.MultiIndex.from_tuples(tups, names=['l1','l2'])

l1          Estimates         
l2          a   c    b
r1          1  10  100
r2          2  20  200
r3          3  30  300
r4          4  40  400
或者当使用阵列作为df的输入时:

data_arr = np.array([[1,2,3,4],[10,20,30,40],[100,200,300,400]])

tups = zip(*[['Estimates']*data_arr.shape[0],['a','b','c'])
df = pd.DataFrame(data_arr.T, index=['r1','r2','r3','r4'], columns=pd.MultiIndex.from_tuples(tups, names=['l1','l2']))
这给出了相同的结果。

这似乎有效:

import pandas as pd

data = {'a': [1,2,3,4], 'b': [10,20,30,40],'c': [100,200,300,400]}

df = pd.concat({"Estimates": pd.DataFrame(data)}, axis=1, names=["l1", "l2"])

l1  Estimates         
l2          a   b    c
0           1  10  100
1           2  20  200
2           3  30  300
3           4  40  400

我知道这个问题很老,但是对于
pandas
version
0.19.1
可以使用直接dict初始化:

d = {('a','b'):[1,2,3,4], ('a','c'):[5,6,7,8]}
df = pd.DataFrame(d, index=['r1','r2','r3','r4'])
df.columns.names = ('l1','l2')
print df

l1  a   
l2  b  c
r1  1  5
r2  2  6
r3  3  7
r4  4  8

在dict示例中是否存在列顺序混乱的风险?换句话说,当Pandas从dict生成数据帧时,它必须从dict中拉出键/值,这将以任意顺序发生。我认为您在up/list理解语句中采用了相同的顺序。这似乎是长期不安全的。我相信,当在DataFrame构造中设置columns关键字时,MTP可以确保某种对齐。好的一点,您确实希望避免这种情况。使用
np.array(data.values()).T
data.keys()
应该可以。根据文档,这个新方案实际上看起来是安全的。调用转置有什么问题吗?例如是否存在数据类型混乱的情况?您认为允许通过创建数据帧的数据帧来创建这种情况有意义吗?例如:pd.DataFrame({“Extimates”:pd.DataFrame(data)})?非常可读,我喜欢。最终,熊猫最好有更好的“级别”管理,比如简单的
df.add_level(axis=1)