如何从字典值中获取特定元素?

时间:2017-11-07 14:11:44

标签: python-3.x dictionary

我有一个699行的字典,看起来像这样:

 .
 .
 '620': ['5', '1', '1', '1', '2', '1', '2', '1', '1', 'benign']
 '581': ['5', '1', '2', '1', '2', '1', '2', '1', '1', 'malignant']
 '618': ['1', '1', '1', '1', '1', '?', '1', '1', '1', 'benign']
 .
 .

随机位置有一些问号。每行都有一个恶性或良性的类作为最后一个元素。要计算此问号,请使用具有相同类的行。
例如,如果一行上有问号并且其类是良性的,则只取具有良性的行,然后找到所有行'索引是问号的索引。然后计算它们的平均值并将其指定为问号。对所有问号重复此操作。

我是初学者。几个星期以来,我无法弄清楚如何做到这一点。

这是一个复杂的任务,但这是我所做的。

dataFile = open('WBC.data','r').read()
dataDic = {i.split(',')[0]: i.split(',')[1:]  for i in dataFile.split('\n')}
print(dataDic)
indexsoruisareti_malignant=[] #soruişaretini oldugu indexler
indexsoruisareti_benign=[]
valueofindex_malignant=[]#malignant olan diğer satırlarda soru işaretinin 
oldugu sütunların elemanları
valueofindex_benign=[]
list1=[]

for key in dataDic:
    if '?' in dataDic[key] and 'malignant' in dataDic[key]:
        i = dataDic[key].index('?')  # attr(i+1)
        indexsoruisareti_malignant.append(i)
        t=list(set(indexsoruisareti_malignant))
    elif '?' in dataDic[key] and 'benign' in dataDic[key]:
        i = dataDic[key].index('?')  # attr(i+1)
        indexsoruisareti_benign.append(i)
        b=list(set(indexsoruisareti_benign))
print(t)
print(b)
for i in indexsoruisareti_malignant:
    for a in range(1,700):
        if '?' in dataDic[str(a)]:
            dataDic[str(a)].remove('?')
        list1.append(dataDic[str(a)][i])
        list2=[int(x) for x in list1]
    s=sum(list2)
print(s)

1 个答案:

答案 0 :(得分:0)

对于这些数据集,建议使用pandas package。基本思想是将数据存储在数据帧中,然后将数据帧分为一个用于良性,一个用于恶性。

然后,对于每个数据框,我们查找值的平均值并将它们插入到缺失的条目中(?)。

最后,我们将它们重新组合在一起并将其转换回字典(假设您需要的输出格式)。

以下是完整代码。 (忽略SettingWithCopyWarning

import pandas as pd
import numpy as np

data =  {'620': ['5', '1', '?', '2', '2', '1', '2', '1', '1', 'benign'],
 '581': ['5', '1', '2', '1', '2', '1', '2', '1', '1', 'malignant'],
 '618': ['1', '1', '1', '1', '1', '?', '1', '1', '1', 'benign']}

# Convert to pandas dataframe
df_all = pd.DataFrame.from_dict(data, orient='index')

# Divide into 2 dataframe (benign and malignant)
df_benign = df_all.loc[df_all[9] == 'benign']
df_malignant = df_all.loc[df_all[9] == 'malignant']

# Go through each data frame separately
for df in [df_benign, df_malignant]:
    for i in range(9):  # Iterate through each column
        # Find all values that are not '?' in the column
        values = [float(v) for v in df[i] if v != '?']
        col_mean = np.mean(values)  # mean of the column
        df.loc[df[i] == '?', i] = col_mean

# Combine the two dataframes        
df = pd.concat([df_benign, df_malignant])

# Convert back to dictionary
data_edited = df.to_dict(orient='index')
data_edited = {key: list(data_edited[key].values()) for key in data_edited.keys()}