2013-11-01 43 views
32

假設我有一個包含10個鍵值對的字典。每個條目都擁有一個numpy數組。但是,它們的長度不一樣。從字典中創建條目具有不同長度的數據框

如何創建一個數據框,其中每列包含不同的條目?

當我嘗試:

pd.DataFrame(my_dict) 

我得到:

ValueError: arrays must all be the same length 

任何方式來解決這個?我很高興Pandas使用NaN填充較短條目的列。

回答

42

在Python 3.X:

In [6]: d = dict(A = np.array([1,2]), B = np.array([1,2,3,4])) 

In [7]: DataFrame(dict([ (k,Series(v)) for k,v in d.items() ])) 
Out[7]: 
    A B 
0 1 1 
1 2 2 
2 NaN 3 
3 NaN 4 

在Python 2.x中:

d.iteritems()取代d.items()

+0

我工作的這個相同的問題最近,這比什麼更好我有!有一點需要注意,使用NaN填充會將系列dtype強制爲float64,如果您需要進行整數運算,這可能會有問題。 – mattexx

+0

表示正確;如果你想要的話,你可以使用fillna(0),儘管 – Jeff

+0

@mattexx你還在SO上嗎?我有一個我自己的數據框問題,你的評論可能實際上是 – theprowler

33

這裏有一個簡單的方法來做到這一點:

In[20]: my_dict = dict(A = np.array([1,2]), B = np.array([1,2,3,4])) 
In[21]: df = pd.DataFrame.from_dict(my_dict, orient='index') 
In[22]: df 
Out[22]: 
    0 1 2 3 
A 1 2 NaN NaN 
B 1 2 3 4 
In[23]: df.transpose() 
Out[23]: 
    A B 
0 1 1 
1 2 2 
2 NaN 3 
3 NaN 4 
+1

orient ='index'是一個非常聰明的事情。我喜歡! – fixxxer

+0

還有其他的選擇'索引'? – sAguinaga

2

儘管這並不直接回答OP的問題。我發現這是我的情況的最佳解決方案,當我有不平等的陣列,我想與大家分享:

from pandas documentation

In [31]: d = {'one' : Series([1., 2., 3.], index=['a', 'b', 'c']), 
    ....:  'two' : Series([1., 2., 3., 4.], index=['a', 'b', 'c', 'd'])} 
    ....: 

In [32]: df = DataFrame(d) 

In [33]: df 
Out[33]: 
    one two 
a 1 1 
b 2 2 
c 3 3 
d NaN 4 
相關問題