我有一个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)
答案 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()}