【问题标题】:Looping through nested dictionary values to populate second dictionary - python循环嵌套字典值以填充第二个字典 - python
【发布时间】:2020-06-08 05:58:00
【问题描述】:

我有以下字典:

rts = {
         "PO1": {
                   "congruent": {

                             "rt": [0.647259, 0.720116, 0.562909, 0.538918, 0.633367],
                        "correct": ["True", "True", "True", "True", "True", "False",]
                             },

                  "incongruent": {

                             "rt": [0.647259, 0.720116, 0.562909, 0.538918, 0.633367],
                        "correct": ["True", "True", "True", "True", "True", "False",]

                             }
         },
         "PO2": {
                   "congruent": {

                             "rt": [0.647259, 0.720116, 0.562909, 0.538918, 0.633367],
                        "correct": ["True", "True", "True", "True", "True", "False",]
                             },

                  "incongruent": {

                             "rt": [0.647259, 0.720116, 0.562909, 0.538918, 0.633367],
                        "correct": ["True", "True", "True", "True", "True", "False",]

                             }
         }
}

这是我目前的代码:

import csv
from pathlib import Path
import json
import numpy as np
from numpy import array


def main():
    rts = {}
    statsDict = {}

    data = Path('C:/Users/oli.warriner/Desktop/data(2)/data')

    for csvfile in data.glob('*.csv'):
        key = csvfile.stem

        with csvfile.open() as f:
            csv_reader = csv.reader(f)

            # Skip the header
            _ = next(csv_reader)

            rts[key] = {
                'congruent': {
                    'rt': [],
                    'correct': []
                },
                'incongruent': {
                    'rt': [],
                    'correct': []
                },
            }

            for tn, ctext, cname, condition, response, rt, correct in csv_reader:
                rts[key][condition]['rt'].append(float(rt))
                rts[key][condition]['correct'].append(correct)


    for k in rts:
        key = k
        statsDict[key] = {
                'congruent': {
                    'mean': [],
                    'stddev': [],
                    'correct': []
                },
                'incongruent': {
                    'mean': [],
                    'stddev': [],
                    'correct': []
                },
            }
        for n in rts[k]:
            for i in rts[key][n]

    array([rts[k] for k in rts]).mean()
    print(array)

if __name__ == "__main__":
    main()

我正在读取一个 csv 文件目录来生成您在上面看到的“rts”字典(它比我刚刚在这里缩短的要大得多)。

我现在要做的是使用“rts”字典来填充“statsDict”。

我需要遍历“rts”字典并分别计算每个键的“congruent”和“incongruent”值中的“rt”值的平均值和标准差。

然后我需要为每个键使用“正确”中的布尔值来计算每个键的真值百分比。

我正在设法遍历字典的前几层,但是现在我有点迷茫,我不知道如何进入下一层并开始进行我需要的统计计算。

希望这对人们来说已经足够清楚了。如果您有任何问题,请告诉我。 提前致谢!

【问题讨论】:

  • 请检查您输入的内容!为什么每个 "PO*" 条目都有两次 "congruent" 条目?
  • @SimonFink 我很抱歉!很好发现,我已经相应地更新了。
  • 另一个提示。在尝试提供minimal reproducable example 时,您可以省略创建rts 的方式。示例数据就足够了。请专注于你想要完成的事情。

标签: python dictionary nested statistics


【解决方案1】:

基于rts给出的例子,你可以用这个代码片段构造一个带有统计信息的字典:

import statistics
import json

rts = { ... as given ... }

stats_dict = {}
for k in rts.keys():
    stats_dict[k] = {}
    for ck in rts[k].keys():
        stats_dict[k][ck] = {}
        stats_dict[k][ck]["mean"] = statistics.mean(rts[k][ck]["rt"])
        stats_dict[k][ck]["stdev"] = statistics.stdev(rts[k][ck]["rt"])    
        stats_dict[k][ck]["true_percentage"] = len([x for x in rts[k][ck]["correct"] if x == "True"]) / len(rts[k][ck]["correct"])

print(json.dumps(stats_dict, indent=2))

注意事项

  • 您不一定需要numpy 来计算静态数据。内置statistics包就足够了
  • 您不需要提前初始化字典。只需使用给定字典 rts 的键并为统计字典 stats_dict 使用相同的键

输出

{
  "PO1": {
    "congruent": {
      "mean": 0.6205138,
      "stdev": 0.07207165926839758,
      "true_percentage": 0.8333333333333334
    },
    "incongruent": {
      "mean": 0.6205138,
      "stdev": 0.07207165926839758,
      "true_percentage": 0.8333333333333334
    }
  },
  "PO2": {
    "congruent": {
      "mean": 0.6205138,
      "stdev": 0.07207165926839758,
      "true_percentage": 0.8333333333333334
    },
    "incongruent": {
      "mean": 0.6205138,
      "stdev": 0.07207165926839758,
      "true_percentage": 0.8333333333333334
    }
  }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-01-20
    • 2016-11-25
    • 1970-01-01
    • 1970-01-01
    • 2023-03-12
    • 2018-07-13
    • 1970-01-01
    相关资源
    最近更新 更多