利用pandas,os包,将文件夹下所有excel文件成绩信息,一人多行,转化为一人一行。如图1到图2的转换。

图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)

 

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值