2017-01-26 4 views
2

入力:私は3列とExcelファイルの形式を含むExcelファイルを持っているのような以下の通りです:ネストされたディクショナリ/ JSONの構造の作成または事前定義|| Pythonの

私は以下の形式で、上記の入力から辞書をしたい
A C D 
A C E 
A F G 
B H J 
B H K 
A F I 
B L M 
B L N 
A F O 

: 出力:

dictionary= {'A':{'C':['D','E'],'F':['G','I','O']},'B':{'H':['J','K'],'L':['M','N']}} 

論理:各別個の列-1の値に対して、入れ子になった辞書&を入れ子にする必要があります。それぞれの異なる列2の値に対して、対応する列3の値のリストを作成する必要があります。

答えて

1

@Edchum @MYGz
感謝!!しかし、パンダを使わずに、私はこのようなことをすることで終わりました。

from xlrd import open_workbook 
from nested_dict import nested_dict 

book = open_workbook(input_file_location) # location of excel file 
sheet_3=book.sheets()[2] #sheet_3 in which i have data 
data_sheet_3 = [sheet_3.row_values(i) for i in xrange(sheet_3.nrows)] # getting data of sheet-3 
# specifying 2-level of nesting 
#format of dictionary: {'Key1':{'Key2':['Value1','value2']},'Key3':{'Key4':['Value3','value4']}} 
dictionary=nested_dict(2,list) 
for row_no in xrange(sheet_3.nrows): 
     col_1=data_sheet_3[row_no][0] 
     col_2=data_sheet_3[row_no][1] 
     col_3=data_sheet_3[row_no][2] 
     dictionary[col_1][col_2].append(col_3) 

print dictionary 

nested_dict(2、list)は、2つのレベルの入れ子を指定できるコードの主な重要ポイントです。

Pythonでネストされた辞書の構造を事前定義することの方が優れているか代替のものが見つかった場合は、exampleと共有してください。

+0

良いdefaultdictも使用できます。 – MYGz

+0

@MYGz、defaultdictのコードを書いてください。私は既定のdictを使用してネスティングのレベルを1つだけ知っているので。 1)collections import defaultdict 2)dictionary = defaultdict(list).. {KEY ':[Value、value1、value2]}を作成します。デフォルトのdict/dict.setdefault()を使用して上記の質問のコードを共有してください。ありがとう!! –

2

あなたはパンダとそのようにそれを行うことができます。

import pandas as pd 

df = pd.read_excel('excel_file', header=None) 
d = {} 
for b in df.groupby([0,1])[2].apply(list).to_frame().iterrows(): 
    if b[0][0] not in d: 
     d[b[0][0]] = {b[0][1]: b[1].tolist()[0]} 
    else: 
     d[b[0][0]][b[0][1]] = b[1].tolist()[0] 
print d 

出力:

{'A': {'C': ['D', 'E'], 'F': ['G', 'I', 'O']}, 'B': {'H': ['J', 'K'], 'L': ['M', 'N']}} 
+0

私は真剣に違う方法を考えていないので、これはうまく見える+1 – EdChum

+0

@EdChum、私はパンダなしで何かをして終了しました。 nested_dictはここで働いた。コードを新しい回答としてチェックしてください! –

関連する問題