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
version0.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)
。