图1
图2
#!/usr/bin/env python
# -*- encoding: utf-8 -*-
'''
@文件 :NRowToCols.py
@说明 :成绩信息一人多行转化为一人一行
@时间 :2020/10/11 09:51:03
@作者 :放鸭江上
@版本 :3.8
'''
import pandas as pd
import os
def 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)