2016-07-27 76 views
2

我正在做一些網頁刮,我存儲的形式感興趣的變量:轉換列表快譯通對數據幀:熊貓

a = {'b':[100, 200],'c':[300, 400]} 

這是一個頁面,其中有兩個b「 s和兩個c's。接下來的頁面可能有三個各自的,在那裏我會並將其作爲:

b = {'b':[300, 400, 500],'c':[500, 600, 700]} 

當我去創建的dict的列表中DataFrame,我得到:

import pandas as pd 
df = pd.DataFrame([a, b]) 

df 
       b    c 
0  [100, 200]  [300, 400] 
1 [300, 400, 500] [500, 600, 700] 

什麼我期待的是:

df 
    b c 
0 100 300 
1 200 400 
2 300 500 
3 400 600 
4 500 700 

我可以創建一個DataFrame每個I存儲網頁和concatDataFrame「SA列表時間結束。然而,根據經驗,這是非常昂貴的,因爲構建成千上萬的DataFrame比從較低級別的構造器(即,dict的列表)創建一個DataFrame要昂貴得多。

+0

可能重複[此問題](http://stackoverflow.com/q/38577737/6525140)?不完全是這樣,但至少兩個問題彼此強烈相關。 – mhoff

+0

對鍵進行迭代和合並列表看起來就像您想要的解決方案。 –

+0

你需要'a'和'b'字典來做其他事情嗎?如果沒有,你可以在你從所有頁面接收到數據的時候繼續附加數據來代替'a',然後執行'df = pd.DataFrame(a)'。 –

回答

1

悟FTW(也許不是最快的,但你可以得到任何更Python):

import pandas as pd 

list_of_dicts = [{'b': [100, 200], 'c': [300, 400]}, 
       {'b': [300, 400, 500], 'c': [500, 600, 700]}] 

def extract(key): 
    return [item for x in list_of_dicts for item in x[key]] 

df = pd.DataFrame({k: extract(k) for k in ['b', 'c']}) 

編輯:

我站好了。它和其他一些方法一樣快。

import pandas as pd 
import toolz 

list_of_dicts = [{'b': [100, 200], 'c': [300, 400]}, 
       {'b': [300, 400, 500], 'c': [500, 600, 700]}] 

def extract(key): 
    return [item for x in list_of_dicts for item in x[key]] 

def merge_dicts(trg, src): 
    for k, v in src.items(): 
     trg[k].extend(v) 

def approach_AlbertoGarciaRaboso(): 
    df = pd.DataFrame({k: extract(k) for k in ['b', 'c']}) 

def approach_root(): 
    df = pd.DataFrame(toolz.merge_with(lambda x: list(toolz.concat(x)), list_of_dicts)) 

def approach_Merlin(): 
    dd = {} 
    for x in list_of_dicts: 
     for k in list_of_dicts[0].keys(): 
      try: dd[k] = dd[k] + x[k] 
      except: dd[k] = x[k] 
    df = pd.DataFrame(dd) 

def approach_MichaelHoff(): 
    merge_dicts(list_of_dicts[0], list_of_dicts[1]) 
    df = pd.DataFrame(list_of_dicts[0]) 


%timeit approach_AlbertoGarciaRaboso() # 1000 loops, best of 3: 501 µs per loop 
%timeit approach_root()     # 1000 loops, best of 3: 503 µs per loop 
%timeit approach_Merlin()    # 1000 loops, best of 3: 516 µs per loop 
%timeit approach_MichaelHoff()   # 100 loops, best of 3: 2.62 ms per loop 
+0

你不能這樣做我的方法。我的函數修改給定的字典,因此你正在使用timeit創建很長的列表......另一件事是整數列表(和字典)的性能明顯長於2-3個元素。 – mhoff

0

那麼簡單地合併每一步中的字典呢?

import pandas as pd 

def merge_dicts(trg, src): 
    for k, v in src.items(): 
     trg[k].extend(v) 

a = {'b':[100, 200],'c':[300, 400]} 
b = {'b':[300, 400, 500],'c':[500, 600, 700]} 

merge_dicts(a, b) 

print(a) 

# {'c': [300, 400, 500, 600, 700], 'b': [100, 200, 300, 400, 500]} 

print(pd.DataFrame(a)) 

#  b c 
# 0 100 300 
# 1 200 400 
# 2 300 500 
# 3 400 600 
# 4 500 700 
1

嘗試這種變化爲清晰起見,鍵:

a = {'e':[100, 200],'f':[300, 400]} 
b = {'e':[300, 400, 500],'f':[500, 600, 700]} 
c = {'e':[300, 400, 500],'f':[500, 600, 700]} 

listDicts = [a,b,c] 
dd= {} 

for x in listDicts: 
    for k in listDicts[0].keys(): 
     try: dd[k] = dd[k] + x[k] 
     except: dd[k] = x[k] 

df = pd.DataFrame(dd) 

    e f 
0 100 300 
1 200 400 
2 300 500 
3 400 600 
4 500 700 
5 100 300 
6 200 400 
7 300 500 
8 400 600 
9 500 700