使用Panda DataFrame预测疾病症状的矩阵

时间:2019-03-21 12:43:52

标签: python arrays pandas matrix

首先,我是python的初学者,我遇到了同样的问题,将我的数据csv文件添加到如下格式的pandas dataFrame中

   disease  symptom  frequence
0   d1       s1       Very frequent (99-80%)
1   d1       s2       Very frequent (99-80%)
2   d2       s1       Frequent (79-30%)
3   d2       s3       Very frequent (99-80%)
4   d3       s2       Occasional (29-5%
5   d4       s1       Very frequent (99-80%)
6   d4       s2       Frequent (79-30%)
7   d4       s3       Occasional (29-5%
8   d5       s3       Occasional (29-5%
9   d5       s4      Very frequent (99-80%)

===> d =名称疾病,s =名称症状

我想在ordre中的疾病和症状组之间创建一个矩阵,以预测每种疾病与其症状相关的...。进行数学测试的主要矩阵

我想成为这样:

    s1  s2  s3  s4  s5 s6
d1  1   1   0   0   0  0
d2  1   0   1   0   0  0
d3  0   1   1   1   1  1
d4  1   0   1   0   0  0
d5  0   0   1   1   0  0

如果d与s相关联,则在矩阵中打印1,而不打印0

我的数据太长了72036行×3列

我根据ysearka的先前答案进行尝试

将熊猫作为pd导入 将numpy导入为np 导入io

data = pd.read_csv("disease_sym_frq_list.csv", sep="[;,]", engine='python')
data

dat_mat= io.StringIO("""\data

""")
mat = pd.read_csv(dat_mat, delim_whitespace=True)

data['norm'] = data.groupby('Disease')['Frequence'].transform('sum')

m = pd.merge(data, mat, left_on='Symptom', right_index=True)
m[mat.index] = m[mat.index].multiply(m['Frequence'] / m['norm'], axis=0)

output = m.groupby('Disease')[mat.index].sum()
output.columns.name = 'Symptom'
print(output)

输出为:

Empty DataFrame
Columns: []
Index: []

我如何解决这个问题

如果有人帮助我非常感谢!谢谢

1 个答案:

答案 0 :(得分:0)

您可以简单地使用pandas.DataFrame.pivot

df['value'] = 1
df_pivot = df.pivot(index='disease', columns='symptom', values='value').fillna(0)

print(df_pivot)
symptom   s1   s2   s3   s4
disease                    
d1       1.0  1.0  0.0  0.0
d2       1.0  0.0  1.0  0.0
d3       0.0  1.0  0.0  0.0
d4       1.0  1.0  1.0  0.0
d5       0.0  0.0  1.0  1.0

注释:您没有提供完整的dataframe,这就是为什么输出中不包含s5s6等的原因。