图1
图2
#!/usr/bin/env python# -*- encoding: utf-8 -*-'''@文件 :NRowToCols.py@说明 :成绩信息一人多行转化为一人一行@时间 :2020/10/11 09:51:03@作者 :放鸭江上@版本 :3.8'''import pandas as pdimport osdef rowtocols(filepath,resultpath):#文件路径均是双斜杠 scores=pd.read_excel(filepath,dtype=str) scores2=pd.read_excel(resultpath,dtype=str) #1、根据原表课程名称,获取表头,并填入新表 subjects=scores['课程名称']#获取所有课程名称,包括重复的 subjects=list(set(subjects))#获取去重后的专业并转化为list方便读取数据,set函数是一个无序不重复的元素集,list为[],set为{} scores2=pd.DataFrame(scores2,columns=['姓名','学号','身份证号']+subjects) scores2['姓名']=str(scores2['姓名'])#这里强制为str,如果不设置,将姓名填入新表会提示将字符串转换为浮点报错,难道默认为浮点? scores2['身份证号']=str(scores2['身份证号']) #2、先填学号,搭框架 numbers=scores['学号'] #去掉重复后的学号 nums=list(set(numbers)) #将去重后的学号填入新表 scores2['学号']=nums #3、填入各科目成绩 nrows=scores.shape[0]#获取原表的行数 for i in range(0,nrows,1): # print(scores['major'].at[i]) #先根据原表的学号,找到目标表该学号所在的行,取出原表科目名称,并把其成绩放入目标表对应科目下 number=scores['学号'].at[i]#原表第i行学号 name=scores['姓名'].at[i]#原表第i行姓名 id=scores['身份证号'].at[i]#原表第i行身份证号 scores2_index=list(scores2['学号']).index(number)#学号在新表中所在的行号 scores2['姓名'].at[scores2_index]=name#将姓名填入新表 scores2['身份证号'].at[scores2_index]=id#将身份证号填入新表 subject=scores['课程名称'].at[i]#原表第i行课程名称 score=scores['总评成绩'].at[i]#原表第i行总评成绩 scores2[subject].at[scores2_index]=score#将成绩填入新表 #4、保存文件 scores2.to_excel(resultpath,index=False,encoding="utf-8")#多个filepath路径文件,使用遍历def nrowtocols(dir): for root_dir,sub_dir,files in os.walk(r'' + dir):#遍历目录下的根目录,子目录,所有文件 # 对文件列表中的每一个文件进行处理,如果文件名字是以‘xlxs’结尾就 # 认定为是一个excel文件,当然这里还可以用其他手段判断,比如你的excel # 文件名中均包含‘res’,那么if条件可以改写为 # if file.endswith('xlsx') and 'res' in file: for file in files: filepath=dir+"\\"+file newfilepath=dir+"\\new"+file newinfo=pd.DataFrame() newinfo.to_excel(newfilepath) rowtocols(filepath,newfilepath)dir1="C:\\Users\\lenovo\\Desktop\\000"nrowtocols(dir1)