2017-05-09 71 views
4

我有一個列表字典(它具有可變長度),我期待着從中創建一個DataFrame的有效方法。
假設我有最小列表長度,所以我可以在創建數據框時截斷更大列表的大小。
這裏是我的僞代碼從長度不等的列表中創建一個DataFrame

data_dict = {'a': [1,2,3,4], 'b': [1,2,3], 'c': [2,45,67,93,82,92]} 
min_length = 3 

有我可以的10K或20K鍵的字典,所以尋找一個有效的方法來創建一個像波紋管

>>> df 
    a b c 
0 1 1 2 
1 2 2 45 
2 3 3 67 

回答

1

一個數據幀可以在過濾的dictvaluesdict comprehension,然後DataFrame完美的作品:

print ({k:v[:min_length] for k,v in data_dict.items()}) 
{'b': [1, 2, 3], 'c': [2, 45, 67], 'a': [1, 2, 3]} 


df = pd.DataFrame({k:v[:min_length] for k,v in data_dict.items()}) 
print (df) 
    a b c 
0 1 1 2 
1 2 2 45 
2 3 3 67 

如果有可能一些長度可少爲min_length添加Series

data_dict = {'a': [1,2,3,4], 'b': [1,2], 'c': [2,45,67,93,82,92]} 
min_length = 3 

df = pd.DataFrame({k:pd.Series(v[:min_length]) for k,v in data_dict.items()}) 
print (df) 
    a b c 
0 1 1.0 2 
1 2 2.0 45 
2 3 NaN 67 

時序

In [355]: %timeit (pd.DataFrame({k:v[:min_length] for k,v in data_dict.items()})) 
The slowest run took 5.32 times longer than the fastest. This could mean that an intermediate result is being cached. 
1000 loops, best of 3: 520 µs per loop 

In [356]: %timeit (pd.DataFrame({k:pd.Series(v[:min_length]) for k,v in data_dict.items()})) 
The slowest run took 4.50 times longer than the fastest. This could mean that an intermediate result is being cached. 
1000 loops, best of 3: 937 µs per loop 

#Allen's solution 
In [357]: %timeit (pd.DataFrame.from_dict(data_dict,orient='index').T.dropna()) 
1 loop, best of 3: 16.7 s per loop 

代碼定時

np.random.seed(123) 
L = list('ABCDEFGH') 
N = 500000 
min_length = 10000 

data_dict = {k:np.random.randint(10, size=np.random.randint(N)) for k in L} 
+0

我對這個解決方案有點熟悉。我想知道,有沒有其他有效的方法來做到這一點(而不是迭代所有的鍵)? –

+0

但是我在你的結果中注意到的最奇怪的事情之一。 「最慢的跑步比最快的跑了5.32倍。這可能意味着中間結果正在被緩存。「熊貓緩存結果嗎? –

+1

難題,我真的不知道答案。也許最好的創建新的問題或在stackoverflow找到答案。 – jezrael

0

一個班輪溶液:

#Construct the df horizontally and then transpose. Finally drop rows with nan. 
pd.DataFrame.from_dict(data_dict,orient='index').T.dropna() 
Out[326]: 
    a b  c 
0 1.0 1.0 2.0 
1 2.0 2.0 45.0 
2 3.0 3.0 67.0