2017-01-02 5 views
0

У меня есть некоторые данные в Excel, которая представляет информацию о графике, и это выглядит следующим образом:чтения из Excel и преобразования данных в словарь в Python

1 2 4.5 
1 3 6.6 
2 4 7.3 
3 4 5.1 

Первые два элемента в каждой строке являются краями граф, а последний элемент - это вес дуги между этими двумя ребрами. Например, край «1» соединен с краем «2», а вес составляет 4,5

импортировать эти данные в Python следующим кодом:

import pandas as pd 
import numpy as np 
import matplotlib.pyplot as plt 

training_data_x = pd.read_excel("/Users/mac/Downloads/navid.xlsx",header=None) 

x= training_data_x.as_matrix() 

Так что «х» здесь является матрица смежности графика. То, что я пытаюсь сделать, это преобразовать x в список словарей в python, которые мне нужны в другом коде. я вроде новичок в Python, но я думаю, что это словарь, который подходит здесь вид выглядит как этот

gr = {'1': {'2': 4.5, '3': 6.6}, 
     '2': {'4': 7.3}, 
     '3': {'4':5.1}} 

На самом деле «гр» должен быть выход из моего кода здесь. Я думаю, что я должен использовать «» pandas.DataFrame.to_dict "», но у меня есть трудное время, используя эту команду, я очень ценю вашу помощь здесь

+0

Я не уверен, что 'x' на самом деле является матрицей смежности, как ее обычно понимают. –

+0

Да. Я понимаю что ты имеешь ввиду. Но мой вопрос по-прежнему существует, как преобразовать x здесь в словарь, как указано выше? – navid

ответ

0

Мой совет:.. Сохранить файл xlsx как csv Теперь, используя ваниль. Python:

import csv 
gr = {} 
with open('data.csv') as f: 
    reader = csv.reader(f) 
    for row in reader: 
     e1, e2, w = row 
     gr.setdefault(e1, {})[e2] = float(w) 

может быть, даже лучше, использовать defaultdict:

import csv 
from collections import defaultdict 
gr = defaultdict(dict) 
with open('data.csv') as f: 
    reader = csv.reader(f) 
    for row in reader: 
     e1, e2, w = row 
     gr[e1][e2] = float(w) 

EDIT: Обратите внимание, что я обратилась к float вручную, но вы, вероятно, может сойти с рук просто проходя тыс e следующий аргумент csv.reader: csv.reader(f, quoting=csv.QUOTE_NONNUMERIC), если вы не против того, чтобы ваши ключи тоже плавали.

+0

Благодарим вас за ответ. Я пропустил последнюю часть, о которой вы говорили о поплавке. Что вы подразумеваете под преобразованием в float? Также я ценю, если вы объясните мне об минуте этого преобразования и что мне делать? – navid

+0

@navid, потому что вам нужны строковые ключи и значения плавающих для самых сокровенных словарей, верно? Это именно то, что вы написали. Модуль 'csv' не выполняет автоматическое преобразование, поэтому вы можете либо получить * все *, преобразованное в float, передав параметр цитирования, либо сделайте это вручную, как я показал. Я бы использовал вторую версию. –

+0

@navid также, вы должны проверить текущую версию, очистить ошибку, которую вы, возможно, не заметили –

2

В случае, если вы хотите, чтобы полагаться на панд большой GroupBy/сплит/объединить функциональность (see more here) в дополнение к pandas.DataFrame.to_dict метода можно реально сделать следующее:

import pandas as pd 

file_path = "/Users/mac/Downloads/navid.xlsx" 
gr = pd.read_excel(file_path, header=None, index_col=0) \ 
    .groupby(level=0) \ 
    .apply(lambda x: dict(x.to_records(False))) \ 
    .to_dict() 

Этот должен работать для всех версий панд выше 0,17.

+0

Ваш 'apply' был очень умным. –

Смежные вопросы