代码之家  ›  专栏  ›  技术社区  ›  Alex_P

创建嵌套字典的迭代问题

  •  2
  • Alex_P  · 技术社区  · 7 年前

    我的数据如下:

                     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 s。 这个 字典应该如下(或相似) :

    {'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)
    

    创建 工作流程 如下所示,也可以正常工作:

    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 和 工作流程 , 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 但在每次迭代后重新创建它们。

    例子

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

    如何创建一个类似于我上面所写内容的字典?

    2 回复  |  直到 7 年前
        1
  •  4
  •   meW    7 年前

    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}]}
    
        2
  •  0
  •   Andrew McDowell    7 年前

    我认为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}}