2017-06-30 10 views
0

4次元リストをpandasデータフレームに変換しようとしています。私はこれを達成するためにトリプルネストされたforループを使用するソリューションを持っていますが、それは非常に最適化されていません - 私はこれに対してより速い解決策が必要であると感じています。私が使用してきたコードは以下の通りです:4dリストをpandasデータフレームに変換する最適化された方法

import pandas as pd 

master_df = pd.DataFrame(columns=('a1', 'a2', 'intersection', 'similarity')) 

for i in master_list[0:2]: 
    for x in i: 
     for y in x:   
      t = [y[0], y[1], repr(y[2]), y[3]] 
      master_df.loc[-1] = t 
      master_df.index = master_df.index + 1 
      master_df = master_df.sort_index() 

これは私がデータフレームに挿入しようとしてきたmaster_listのスライスです。

master_list = [[[['residential property 42 holywell hill st. albans east of england al1 1bx', 
'gnd flr 38 holywell hill st albans herts al1 1bx', 
{'1bx', 'al1', 'albans', 'hill', 'holywell'}, 
0.5809767086589066], 
['residential property 42 holywell hill st. albans east of england al1 1bx', 
'62 holywell hill st albans herts al1 1bx', 
{'1bx', 'al1', 'albans', 'hill', 'holywell'}, 
0.62250400597525191]]], 
[[['aitchisons 2 holywell hill st. albans east of england al1 1bz', 
'22 holywell hill st albans herts al1 1bz', 
{'1bz', 'al1', 'albans', 'hill', 'holywell'}, 
0.64696827426453596], 
['aitchisons 2 holywell hill st. albans east of england al1 1bz', 
'24 holywell hill st albans herts al1 1bz', 
{'1bz', 'al1', 'albans', 'hill', 'holywell'}, 
0.64660269146725069], 
['aitchisons 2 holywell hill st. albans east of england al1 1bz', 
'26 holywell hill st albans herts al1 1bz', 
{'1bz', 'al1', 'albans', 'hill', 'holywell'}, 
0.64617599950794757], 
['aitchisons 2 holywell hill st. albans east of england al1 1bz', 
'20 holywell hill st albans herts al1 1bz', 
{'1bz', 'al1', 'albans', 'hill', 'holywell'}, 
0.64798547824947428]]]] 

この4dリストをpandasデータフレームに変換するのに誰かが助けてくれますか?

サム

+0

ディクショナリごとにreprを使用するポイントは何ですか? – FLab

+0

@FLab(データフレーム列のように)a1とa2の間に一連の交差トークンの文字列表現を挿入しようとしていますが、 –

答えて

3

ここでは、ソリューションです:

  • Flattenmaster_list
  • 辞書用使用のrepr(私はあなたが本当にこれを必要とは思わない...)
  • Reshape値に4列ある

コード:

def flatten(container): 
    for i in container: 
     if isinstance(i, (list,tuple)): 
      for j in flatten(i): 
       yield j 
     else: 
      yield i 

def fix_dict(x): 
    return repr(x) if isinstance(x, dict) else x 

all_values = list(flatten(master_list)) 
all_values = [fix_dict(val) for val in all_values] 

master_df = pd.DataFrame(np.reshape(all_values, (-1, 4)), columns = ['a1', 'a2', 'intersection', 'similarity']) 

これは、予想される出力を示します。

関連する問題