一、设计需求
- 如下图所示表格具有incase_id、Symptom、疾病分型三种属性。数据升序排列。
- 先需将Symptom中的所有取值进行去重,并将去重后的取值作为新表格的属性。
- 然后判断每个incase_id对应的所有Symptom,若存在于新表格中对应属性下则取值 1 ,若不存在取值为 0;
- 最后将对应的疾病分型作为新表格的最后一个属性。
-
二、解决步骤
1.直接对Symptom属性利用函数进行去重操作,将得到的所有值作为新表格的属性。
示例:
2.把所有incase_id及其对应属性,转换成只具有两列的excel表格,其中第一列为incase_id,第二列为incase_id对应的所有属性。
例如:
3.把第2步得到的结果根据属性是否存在填入第1步得到的新表中。
4.添加分型。
tip: 第1步和第2步顺序可互换,不影响结果。
三、代码分解
1.去重并建立新dataframe
#去重并生成表格
df = pd.read_excel(excel_name, sheet_name='症状',encoding='utf8') #读取excel数据
data=pd.DataFrame(df) #将excel数据表转化为dataframe格式
tempId = data.iloc[:,0] #获取所有incase_id
tempSymptom = data.iloc[:,1] #获取所有Symptom
tempLevel=data.iloc[:,2] #获取所有疾病分型
print('Symptom number Before drop:',len(tempSymptom))
uniqueId = tempId.drop_duplicates() #去重 incase_id
uniqueSymptom = tempSymptom.drop_duplicates() #去重 Symptom
df_empty = pd.DataFrame(columns=uniqueSymptom) #以去重后的Symptom作为属性生成新的dataframe
print('Symptom number fter drop:',len(uniqueSymptom))
新建立的dataframe:
2.转换数据
#统计特征
row = df.shape[0] #数据行数
col = df.shape[1] #数据列数
i = 0
finalData=[] #储存所有incase_id对应的数据,形式为[incase_id,[Symptom]]
while i < row:
start = i #记录不同incase_id最初的位置
end = i
lineData=[] #储存incase_id
symptomsData=[] #储存incase_id对应的所有symptom
lineData.append(df.loc[i][0]) #添加新的incase_id
symptomsData.append(df.loc[i][1]) #添加symptom
while end < row:
end += 1
if(end == row): #循环结束到达最后一个元组
break
if (df.loc[start][0]) == (df.loc[end][0]):#判断当前元组的incase_id与最开始记录的incase_id是否一致
symptomsData.append(df.loc[end][1]) #若一致则添加属性
else: #若不一致则证明到达新的incase_id,
break
lineData.append(symptomsData)
finalData.append(lineData)
i = end #相同incase_id的最后位置
统计后的数据:
3.填充数据(此时疾病分型还未添加)
#用于判断症状是否在属性里的函数
def fillData(vector,index):
new_line=[0]*len(index) #建立和index相同个数的list,元素均为0 [0,0,0,0,0...]
for i in range(len(index)):
if index[i] in vector: #判断index的值是否存在于Symptom,若存在则index对应值为1
new_line[i]=1
return new_line
#填充数据(未加疾病分型)
for row in range(len(uniqueId)):
new_line=fillData(finalData[row][1],df_empty.columns) #使用函生成0 1 型的元组
df_empty.loc[row]=new_line #将元组填入dataframe
生成的dataframe:
4.添加疾病分型
uniqueLevel=[] #储存分型
flag=None
for i in range(len(tempLevel)): #生成分型
if flag!=data.iloc[i][0]: #根据当前incase_id是否后前一元组的id一致添加分型
uniqueLevel.append(data.iloc[i][2])
flag=data.iloc[i][0]
df_empty.insert(df_empty.shape[1], '分型', uniqueLevel)#对dataframe增加新的属性,并将储存的分型list作为该属性列
uniqueLevel[]:
最终统计见下文完整示例
四、完整示例
import pandas as pd
import xlrd
from pandas import DataFrame
excel_name = 'D:/testdata.xlsx'
#去重并生成表格
df = pd.read_excel(excel_name, sheet_name='症状',encoding='utf8') #读取excel数据
data=pd.DataFrame(df) #将excel数据表转化为dataframe格式
tempId = data.iloc[:,0] #获取所有incase_id
tempSymptom = data.iloc[:,1] #获取所有Symptom
tempLevel=data.iloc[:,2] #获取所有疾病分型
print('Symptom number Before drop:',len(tempSymptom))
uniqueId = tempId.drop_duplicates() #去重 incase_id
uniqueSymptom = tempSymptom.drop_duplicates() #去重 Symptom
df_empty = pd.DataFrame(columns=uniqueSymptom) #以去重后的Symptom作为属性生成新的dataframe
print('Symptom number fter drop:',len(uniqueSymptom))
#统计特征
row = df.shape[0] #数据行数
col = df.shape[1] #数据列数
i = 0
finalData=[] #储存所有incase_id对应的数据,形式为[incase_id,[Symptom]]
while i < row:
start = i #记录不同incase_id最初的位置
end = i
lineData=[] #储存incase_id
symptomsData=[] #储存incase_id对应的所有symptom
lineData.append(df.loc[i][0]) #添加新的incase_id
symptomsData.append(df.loc[i][1]) #添加symptom
while end < row:
end += 1
if(end == row): #循环结束到达最后一个元组
break
if (df.loc[start][0]) == (df.loc[end][0]):#判断当前元组的incase_id与最开始记录的incase_id是否一致
symptomsData.append(df.loc[end][1]) #若一致则添加属性
else: #若不一致则证明到达新的incase_id,
break
lineData.append(symptomsData)
finalData.append(lineData)
i = end #相同incase_id的最后位置
#用于判断症状是否在属性里的函数
def fillData(vector,index):
new_line=[0]*len(index) #建立和index相同个数的list,元素均为0 [0,0,0,0,0...]
for i in range(len(index)):
if index[i] in vector: #判断index的值是否存在于Symptom,若存在则index对应值为1
new_line[i]=1
return new_line
#填充数据(未加疾病分型)
for row in range(len(uniqueId)):
new_line=fillData(finalData[row][1],df_empty.columns) #使用函生成0 1 型的元组
df_empty.loc[row]=new_line #将元组填入dataframe
uniqueLevel=[] #储存分型
flag=None
for i in range(len(tempLevel)): #生成分型
if flag!=data.iloc[i][0]: #根据当前incase_id是否后前一元组的id一致添加分型
uniqueLevel.append(data.iloc[i][2])
flag=data.iloc[i][0]
df_empty.insert(df_empty.shape[1], '分型', uniqueLevel)#对dataframe增加新的属性,并将储存的分型list作为该属性列
#将dataframe转化为excel文档
writer=pd.ExcelWriter('finalData_0_1加分型.xlsx')
df_empty.to_excel(writer,'症状')
writer.save()
结果:
五、特别声明
1.感谢博主 许玉龙老师 的指导与建议。
2.上述教程源于实际的项目案例,在发布时对这些实验数据进行了处理改造。
3.数据版权归河南中医药大学信息技术学院所有,仅供于免费学习和交流。
4.转载请注明出处,若用于商业用途,版权所有者将保留追究法律权利.