计算词典中的价值观

时间:2015-06-14 18:12:16

标签: python dictionary

我在python中没有经验,我需要对数据集进行最后一次修改。我的数据如下:

"bone": {
    "SEV": 12, 
    "ER": 16, 
    "FAM": 177
}, 
"fracture": {
    "SEV": 76
}, 
"chest pain": {
    "ER": 6
}, 

它是大量的键,每个键都有1到10个左右的标签。我想要做的是将数字改为概率。所以,例如,

"bone": {
"SEV": .05, 
"ER": .07, 
"FAM": .86
}, 

因此,总结标签的总和,然后将每个标签的值除以总和。我不确定如何以有效的方式迭代这些。

编辑:代码我正在尝试而不是正常工作

with open('probability.json') as data_file:    
    data = json.load(data_file)

loadedd = json.loads(data)


def calculate_percentage(labels):
     total = float(sum(labels.values()))
     return {k: v / total for k,v in labels.items()}

for section in loadedd:
     section = calculate_percentage(section)

给出错误

    obj, end = self.raw_decode(s, idx=_w(s, 0).end())
TypeError: expected string or buffer

4 个答案:

答案 0 :(得分:1)

您必须对这些值求和并将每个项目除以此总和:

def calculate_percentage(labels):
    total = float(sum(labels.values()))
    return {k: v / total for k,v in labels.items()}

print calculate_percentage({
    "SEV": 12, 
    "ER": 16, 
    "FAM": 177
})

结果

{'SEV': 0.05853658536585366, 'ER': 0.07804878048780488, 'FAM': 0.8634146341463415}

答案 1 :(得分:1)

如果您使用字典词典,请使用 -

dict = { 'a' : { 'SEV' : 12 , 'ER' : 6 } }

您可以使用类似 -

的内容
for k, v in dict.iteritems():
    vtot = sum(v.values())
    for k1,v1 in vtot.iteritems():
        vtot[k1] = v1 / vtot

答案 2 :(得分:1)

{'bone': {'SEV': 0.05853658536585366, 'ER': 0.07804878048780488, 'FAM': 0.8634146341463415}}

将打印出一个以百分比为键的新词典:

re.sub

答案 3 :(得分:1)

有两个问题。

由于尾​​随逗号,您的文档无效json文档。有效文件如下所示:

"bone": {
    "SEV": 12, 
    "ER": 16, 
    "FAM": 177
}, 
"fracture": {
    "SEV": 76
}, 
"chest pain": {
    "ER": 6
}

你也是两次调用json库方法,这是一对多。只需一个电话即可:

with open('probability.json') as data_file:    
    data = json.load(data_file)
assert isinstance(data, dict)

之后,您应该可以按如下方式对数据进行后处理:

for section in data.keys():
     section_total = float(sum(data[section].itervalues()))
     data[section] =  {k: v / section_total for k,v in labels.iteritems()}