2015-06-14 70 views
0

我沒有在Python中體驗過,而且我還需要對數據集進行最後一次修改。我的數據如下:在字典中計算價值Perentages

"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 
+0

似乎沒有要在此代碼的任何元組... –

+0

'數據'可能沒有字符串,可以用'json.loads'來使用。 – Daniel

+0

@Daniel,數據有標籤,每個標籤都有一個十進制值。 –

回答

1
data = {'bone': {'SEV': 12, 
       'ER': 16, 
       'FAM': 177 
       } 
     } 


for injury, ward_dict in data.iteritems(): 

    total = float(sum(ward_dict.values())) 
    percentage = [number/total for number in ward_dict.values()] 
    data_out = {injury: {k: v for k, v in zip(ward_dict.keys(), percentage)} } 
    print(data_out) 

這將打印出一個新的字典,百分比爲鑰匙:

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

這工作完美,謝謝 –

+0

太棒了!此外,百分比之上的小錯字是內部字典的值,而不是密鑰。 – N1B4

+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} 
+0

total = float(sum(labels.values())) AttributeError:'unicode'對象沒有屬性'values'。我想我的數據結構是錯誤的 –

+0

您必須將您的字符串轉換爲Python字典,例如與'json.loads'。 – Daniel

+0

我試過了,它沒有工作。我用我正在嘗試的代碼更新了問題。 –

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 
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()}