【问题标题】:Why all values are the same in nested dictionary?为什么嵌套字典中的所有值都相同?
【发布时间】:2021-11-24 16:16:31
【问题描述】:

我正在尝试生成一个嵌套字典,但是当 for 循环完成时,每个键中的所有值都相同。

def frequency(df, headers, numerical, target):
di = {}
if len(numerical) == 0:
    print("No NM")
else:
    for i in numerical:
        if i in headers:
            headers.remove(i)

    for i in range(len(headers)):
        attdic = {}
        valdic = {}
        aux_list = df[headers[i]].to_list()
        aux_list = list(OrderedDict.fromkeys(aux_list))
        tar_list = df[target].to_list()
        tar_list = list(OrderedDict.fromkeys(tar_list))

        for j in range(len(aux_list)):
            print(aux_list[j])

            for k in range(len(tar_list)):
                temp_df = df.loc[(df[headers[i]] == aux_list[j]) & (df[target] == tar_list[k])]
                tempvar = len(temp_df.index) + 1  

                valdic[tar_list[k]] = tempvar
                attdic[aux_list[j]] = valdic
                di[headers[i]] = attdic

输出:

{'Outlook': {'overcast': {'No': 2, 'Yes': 5}, 'rainy': {'No': 2, 'Yes': 5}, 'sunny': {'No': 2, 'Yes': 5}}, 'Windy': {False: {'No': 3, 'Yes': 5}, True: {'No': 3, 'Yes': 5}}}

预期输出:

{'Outlook': {'overcast': {'No': 3, 'Yes': 3}, 'rainy': {'No': 3, 'Yes': 4}, 'sunny': {'No': 2, 'Yes': 5}}, 'Windy': {False: {'No': 4, 'Yes': 6}, True: {'No': 3, 'Yes': 5}}}

【问题讨论】:

    标签: python-3.x pandas dictionary


    【解决方案1】:

    请注意,您为每个 i 创建了一个 valdic,但您应该为每个 (i,j) 创建一个,因此您可以将其移动到 j 的循环中,也许它可以工作

    def frequency(df, headers, numerical, target):
    di = {}
    if len(numerical) == 0:
        print("No NM")
    else:
        for i in numerical:
            if i in headers:
                headers.remove(i)
    
        for i in range(len(headers)):
            attdic = {}
            aux_list = df[headers[i]].to_list()
            aux_list = list(OrderedDict.fromkeys(aux_list))
            tar_list = df[target].to_list()
            tar_list = list(OrderedDict.fromkeys(tar_list))
    
            for j in range(len(aux_list)):
                valdic = {} # create a new valdic for each j
                print(aux_list[j])
    
                for k in range(len(tar_list)):
                    temp_df = df.loc[(df[headers[i]] == aux_list[j]) & (df[target] == tar_list[k])]
                    tempvar = len(temp_df.index) + 1  
    
                    valdic[tar_list[k]] = tempvar
                attdic[aux_list[j]] = valdic
            di[headers[i]] = attdic
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-04-04
      • 2022-06-13
      • 2011-05-03
      • 2013-07-04
      • 2019-06-10
      • 2023-03-02
      • 1970-01-01
      • 2022-10-13
      相关资源
      最近更新 更多