2016-07-27 4 views
2

私がやっているいくつかのWebスクレイピングと私はの形で関心の変数を格納しています:の変換リストDictのデータフレームへの:パンダ

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

これがあった1ページのための2つb " 2つのcのです。私はdict年代のリストからDataFrameを作成するために行くとき、私が取得

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

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

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

何次のページでは、と私はそれらを保存したい各の3を持っている可能性があり私は期待しています:

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

私はDataFrame「SAのリストをページを保存し、concatDataFrameたびに作成することができます終わり。しかし、経験に基づいて、これは非常に高価です。何故ならば、DataFrameの建設は、下位レベルのコンストラクタ(すなわちdictのリスト)からDataFrameを作成するよりもはるかに高価なためです。

+0

[この質問の可能な重複](http://stackoverflow.com/q/38577737/6525140)?正確ではありませんが、少なくとも両方の質問はお互いに強く関係しています。 – mhoff

+0

キーを反復し、リストをマージすることは、あなたが望むソリューションのようです。 –

+0

他に何かのために 'a'と' b'のディクテーションが必要ですか?そうでない場合は、すべてのページからデータを受け取ったときにデータを追加するだけで、 'df = pd.DataFrame(a)'を実行することができます。 –

答えて

1

内包表記(多分最速、しかし、あなたはそれ以上のニシキヘビを得ることができない?):

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

明確にするためのキー、この変更をお試しください:FTW

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 
関連する問題