Python对excel复杂数据文件的二值化操作

一、设计需求

  • 如下图所示表格具有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.转载请注明出处,若用于商业用途,版权所有者将保留追究法律权利.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值