Итерационная проблема для создания вложенного словаря - PullRequest
0 голосов
/ 03 января 2019

Мои данные выглядят следующим образом:

                 Application                       WorkflowStep
0                WF:ACAA-CR (auto)                      Manager
1                WF:ACAA-CR (auto)           Access Responsible
2                WF:ACAA-CR (auto)                    Automatic
3                WF:ACAA-CR-AccResp (auto)              Manager
4                WF:ACAA-CR-AccResp (auto)   Access Responsible
5                WF:ACAA-CR-AccResp (auto)            Automatic
6                WF:ACAA-CR-IT-AccResp[AUTO]              Group
7                WF:ACAA-CR-IT-AccResp[AUTO] Access Responsible
8                WF:ACAA-CR-IT-AccResp[AUTO]          Automatic

В дополнение к этим двум столбцам я хочу добавить третий столбец, показывающий сумму всех WorkflowStep. Словарь должен выглядеть следующим образом (или похожим) :

{'WF:ACAA-CR (auto)': 
             [{'Workflow': ['Manager', 'Access Responsible','Automatic'], 'Summary': 3}], 
 'WF:ACAA-CR-AccResp (auto)': 
             [{'Workflow': ['Manager','Access Responsible','Automatic'], 'Summary': 3}], 
 'WF:ACAA-CR-IT-AccResp[AUTO]': 
             [{'Workflow': ['Group','Access Responsible','Automatic'], 'Summary': 3}]
}

Мой код для создания словаря из двух приведенных выше столбцов работает нормально.

for i in range(len(df)):
    currentid = df.iloc[i,0]
    currentvalue = df.iloc[i,1]
    dict.setdefault(currentid, [])
    dict[currentid].append(currentvalue)

Код для создания суммы WorkflowStep выглядит следующим образом и также отлично работает:

for key, values in dict.items():
    val = values
    match = ["Manager", "Access Responsible", "Automatic", "Group"]
    c = Counter(val)
    sumofvalues = 0
    for m in match:
        if c[m] == 1:
            sumofvalues += 1

Моя первоначальная идея состояла в том, чтобы настроить мой первый код, где начальный ключ - это Application, а WorkflowStep, Summary - это под-словари.

for i in range(len(df)):
    currentid = df.iloc[i,0]
    currentvalue = df.iloc[i,1]
    dict.setdefault(currentid, [])
    dict[currentid].append({"Workflow": [currentvalue], "Summary": []})

Результат этого, однако, является неудовлетворительным, поскольку он не добавляет currentvalue к уже существующему ключу Workflow, а воссоздает их после каждой итерации.

Пример * +1031 *

 {'WF:ACAA-CR (auto)': [{'Workflow': ['Manager'], 'Summary': []},
                        {'Workflow': ['Access Responsible'], 'Summary': []}, 
                        {'Workflow': ['Automatic'], 'Summary': []}]
 }

Как создать словарь, похожий на то, что я написал выше?

Ответы [ 2 ]

0 голосов
/ 03 января 2019

Я думаю, что ответ meW - намного лучший способ сделать что-то, и он использует преимущества мощной базы данных, но для справки: если вы хотите сделать это так, как пытались, я думаю, что это будет работать:

# Create the data for testing.
d = {'Application': ["WF:ACAA-CR (auto)", "WF:ACAA-CR (auto)", "WF:ACAA-CR (auto)",
                     "WF:ACAA-CR-AccResp (auto)", "WF:ACAA-CR-AccResp (auto)", "WF:ACAA-CR-AccResp (auto)"],
     'WorkflowStep': ["Manager", "Access Responsible","Automatic","Manager","Access Responsible", "Automatic"]}
df = pd.DataFrame(d)

new_dict = dict()
# Iterate through the rows of the data frame. 
for index, row in df.iterrows():
    # Get the values for the current row.
    current_application_id = row['Application']
    current_workflowstep = row['WorkflowStep']

    # Set the default values if not already set.
    new_dict.setdefault(current_application_id, {'Workflow': [], 'Summary' : 0})

    # Add the new values.
    new_dict[current_application_id]['Workflow'].append(current_workflowstep)
    new_dict[current_application_id]['Summary'] += 1

print(new_dict)

Что дает вывод:

{'WF:ACAA-CR (auto)': {'Workflow': ['Manager', 'Access Responsible', 'Automatic'], 'Summary': 3}, 
'WF:ACAA-CR-AccResp (auto)': {'Workflow': ['Manager', 'Access Responsible', 'Automatic'], 'Summary': 3}}
0 голосов
/ 03 января 2019

IIUC, вот что может помочь -

val = df.groupby('Application')['WorkflowStep'].unique()
{val.index[i]: [{'WorkflowStep':list(val[i]), 'Summary':len(val[i])}] for i in range(len(val))}

в результате

{'WF:ACAA-CR (auto)': [{'WorkflowStep': ['Manager', 'Access Responsible', 'Automatic'], 'Summary': 3}],
 'WF:ACAA-CR-AccResp (auto)': [{'WorkflowStep': ['Manager', 'Access Responsible', 'Automatic'], 'Summary': 3}],
 'WF:ACAA-CR-IT-AccResp[AUTO]': [{'WorkflowStep': ['Group', 'Access Responsible', 'Automatic'], 'Summary': 3}]}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...