2013-08-01 54 views
2

使用分層列創建DataFrame的最簡單方法是什麼?使用分層列創建數據框

df = pd.DataFrame(data=serieses)

我想用相同的列名,但在列層次添加一個附加級別:使用>Series -

我目前從名字的字典創建一個數據幀。目前我希望額外的級別具有相同的列值,比如說「預算」。

我嘗試以下,但似乎並沒有工作:

pd.DataFrame(data=serieses,columns=pd.MultiIndex.from_tuples([(x, "Estimates") for x in serieses.keys()]))

我得到的是與所有的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爲多指標

回答

5

這似乎工作:

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 
+0

這是非常可讀的,我喜歡它。最終熊貓可能最好有更好的'級別'管理,就像一個簡單的'df.add_level(axis = 1)'。 –

1

IM的標籤,不知道,但我覺得用一個字典作爲輸入您的DF MulitIndex不會很好地一起玩。使用數組作爲輸入,而不是使其工作。

我常常喜歡類型的字典爲輸入不過,一種方法是創建DF後設置的列:使用數組作爲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 

或者:

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'])) 

哪給出了相同的結果。

+0

是否存在一個風險,即列順序將在字典例子中搞砸了嗎?換句話說,當Pandas從一個字典中生成DataFrame時,它必須將鍵/值從字典中取出,這將以任意順序發生。我認爲你在上/理解陳述中假定了相同的順序。這似乎是長期不安全的。我相信當在DataFrame構造中設置columns關鍵字時,Pandas會嘗試確保某種對齊。 –

+0

好點,你想避免這一點的確如此。使用'np.array(data.values())。T'和'data.keys()'應該沒問題。 –

+0

根據文檔http://docs.python.org/2/library/stdtypes.html#dict.items,新提案確實看起來很安全。 –

1

我知道真正的問題是舊的,但對於0.19.1pandas版本可以使用直接字典初始化:

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