Цикл Python для создания словаря - PullRequest
0 голосов
/ 25 июня 2018

Мне нужно создать таблицы поиска в Python из CSV. Я должен сделать это, однако, с помощью уникальных значений в моих столбцах. Пример прилагается. У меня есть name столбец, который является названием модели. Для расширенной модели мне нужен словарь с заголовком из столбца variable, ключом из столбца level и значением из столбца value. Я думаю, что лучше всего это словарь словарей. Я буду использовать эту справочную таблицу в будущем, чтобы умножить значения вместе на основе ключей.

Вот код для генерации образца набора данных:

 Name = ['model1', 'model1', 'model1', 'model2', 'model2', 
'model2','model1', 'model1', 'model1', 'model1', 'model2', 'model2', 
'model2','model2']
 Variable = ['channel_model','channel_model','channel_model','channel_model','channel_model','channel_model', 'driver_age', 'driver_age', 'driver_age', 'driver_age', 
'driver_age', 'driver_age', 'driver_age', 'driver_age']
channel_Level = ['Dir', 'IA', 'EA','Dir', 'IA', 'EA', '21','22','23','24', '21','22','23','24']
Value = [1.11,1.18,1.002, 2.2, 2.5, 2.56, 1.1,1.2,1.3,1.4,2.1,2.2,2.3,2.4]
df= {'Name': Name, 'Variable': Variable, 'Level': channel_Level, 'Value':Value}
factor_table = pd.DataFrame(df)

Я прочитал следующее, но это не дало хороших результатов: Python Создание словаря из данных Excel

Я также пробовал:

import pandas as pd
factor_table = pd.read_excel('...\\factor_table_example.xlsx')

#define function to be used multiple times
def factor_tables(file, model_column, variable_column, level_column, value_column):
    for i in file[model_column]:
        for row in file[variable_column]:
            lookup = {}
            lookup = dict(zip(file[level_column], file[value,column]))

Это приводит к ошибке: `dict ожидал не более 1 аргумента, получил 2

В конечном итоге я хотел бы, чтобы: {{'model2':{'channel':{'EA':1.002, 'IA': 1.18, 'DIR': 1.11}}}, {'model1'::{'channel':{'EA':1.86, 'IA': 1.66, 'DIR': 1.64}}}}

Ответы [ 2 ]

0 голосов
/ 25 июня 2018

Используя collections.defaultdict, вы можете создать вложенный словарь, повторяя ваш фрейм данных.Затем переназначить в список словарей через понимание списка.

from collections import defaultdict

tree = lambda: defaultdict(tree)

d = tree()
for row in factor_table.itertuples(index=False):
    d[(row.Name, row.Variable)].update({row.Level: row.Value})

res = [{k[0]: {k[1]: dict(v)}} for k, v in d.items()]

print(res)

[{'model1': {'channel_model': {'Dir': 1.110, 'EA': 1.002, 'IA': 1.180}}},
 {'model2': {'channel_model': {'Dir': 2.200, 'EA': 2.560, 'IA': 2.500}}},
 {'model1': {'driver_age': {'21': 1.100, '22': 1.200, '23': 1.300, '24': 1.400}}},
 {'model2': {'driver_age': {'21': 2.100, '22': 2.200, '23': 2.300, '24': 2.400}}}]
0 голосов
/ 25 июня 2018

Похоже, ваша ошибка может исходить из этой строки:

lookup = dict(zip(file[level_column], file[value,column]))

где file - это диктат, ожидающий один ключ, но вы даете ему value,column, таким образом, он получил два аргумента. Цикл, который вы можете искать, выглядит примерно так:

def factor_tables(file, model_column, variable_column, level_column, value_column):
    lookup = {}

    for i in file[model_column]:

        lookup[model_column] = dict(zip(file[level_column], file[value_column]))

    return lookup

Это вернет вам один словарь с ключами, соответствующими отдельным (и уникальным) моделям:

{'model_1':{'level_col': 'val_col'}, 'model_2':...}

Позволяет использовать:

lookups.get('model_1') {'level_col': 'val_col'}

Если вам нужен variable_column, вы можете обернуть его на один уровень глубже:

def factor_tables(file, model_column, variable_column, level_column, value_column):
    lookup = {}

    for i in file[model_column]:

        lookup[model_column] = {variable_column: dict(zip(file[level_column], file[value_column]))}

    return lookup
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...