吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 3915|回复: 14
收起左侧

[讨论] 中学成绩分析-提取每科最高分学生名单

[复制链接]
lvcaolhx 发表于 2019-11-16 18:59
本帖最后由 lvcaolhx 于 2019-11-20 10:53 编辑

import pandas as pd  #load_data 1.0版
def load_data():
    global start,end,sort_kemu_list,df
    df=pd.read_excel('数据1_2.xlsx',sheet_name='成绩',usecols=list(range(0,10)))
    df['总分']=df.loc[:,'语文':'生物'].sum(axis=1)
    df['班名']=df.groupby('班级').总分.rank(method='min',ascending=False).astype(int)
    df['年名']=df.总分.rank(method='min',ascending=False).astype(int)
    source_biaot_list=list(df.columns) #原始数据表头
    print( source_biaot_list)
    start,end=input('>>> 请输入科目起始列和结束列(从0开始数),空格隔开,回车结束:').split()
    kemudata_cols=source_biaot_list[int(start):int(end)+1] #科目表头
    default_cols=['语文','数学','外语','英语','物理','化学', '生物', '政治','历史', '地理']
    sort_kemu_list=[x for i in default_cols for x in  source_biaot_list if i in x] #将科目表头按照设定的顺序排列
    source_biaot_list[int(start):int(end)+1]=sort_kemu_list
    sort_biaot_list= source_biaot_list
    print(sort_biaot_list)
    df=df[sort_biaot_list] #将最终表的列序按照设定的顺序排列
    return df
load_data()
#df[df['语文']==111]
def get_col(x_df,colx):
    col0=['姓名','班级']
    col0.extend(colx.split(' '))
    df2=x_df[col0]
   
    return df2.loc[df2[colx]==df2[colx].max()]
yuwen_df=get_col(df,'语文').T
yuwen_df.index = ['姓名','班级','最高分']

shuxue_df=get_col(df,'数学').T
shuxue_df.index = ['姓名','班级','最高分']
print(yuwen_df)

yingyu_df=get_col(df,'英语').T
yingyu_df.index = ['姓名','班级','最高分']

wuli_df=get_col(df,'物理').T
wuli_df.index = ['姓名','班级','最高分']

shengwu_df=get_col(df,'生物').T
shengwu_df.index = ['姓名','班级','最高分']

huaxue_df=get_col(df,'化学').T
huaxue_df.index = ['姓名','班级','最高分']

print(shuxue_df)
print(yingyu_df)
result=pd.merge(yuwen_df,shuxue_df,left_index=True, right_index=True, how='left')
result=pd.merge(result,yingyu_df,left_index=True, right_index=True, how='left')
result=pd.merge(result,wuli_df,left_index=True, right_index=True, how='left')
result=pd.merge(result,huaxue_df,left_index=True, right_index=True, how='left')
result=pd.merge(result,shengwu_df,left_index=True, right_index=True, how='left')
print(result)
result.to_excel(r'D:\test\retmax.xls')
思维混乱,代码拼凑而成,能优雅的地方很多;
程序输出与目标输出表格相差很大,实在没能力了,请各位大神指点
数据姓名脱敏处理
请各位大神,代码优化,输出格式匹配目标表格.
源代码与数据:
链接:https://pan.baidu.com/s/1lW8RfSmI4sdUeJKUVClf2Q
提取码:2d1l
复制这段内容后打开百度网盘手机App,操作更方便哦

更新:
输出表头,简化了代码:
import pandas as pd  #2.0版
def load_data():
    global start,end,sort_kemu_list,df
    df=pd.read_excel('数据2.xlsx',sheet_name='成绩',usecols=list(range(0,10)))
    df['总分']=df.loc[:,'语文':'生物'].sum(axis=1)
    df['班名']=df.groupby('班级').总分.rank(method='min',ascending=False).astype(int)
    df['年名']=df.总分.rank(method='min',ascending=False).astype(int)
    source_biaot_list=list(df.columns) #原始数据表头
    print( source_biaot_list)
    start,end=input('>>> 请输入科目起始列和结束列(从0开始数),空格隔开,回车结束:').split()
    kemudata_cols=source_biaot_list[int(start):int(end)+1] #科目表头
    default_cols=['语文','数学','外语','英语','物理','化学', '生物', '政治','历史', '地理']
    sort_kemu_list=[x for i in default_cols for x in  source_biaot_list if i in x] #将科目表头按照设定的顺序排列
    source_biaot_list[int(start):int(end)+1]=sort_kemu_list
    sort_biaot_list= source_biaot_list
    print(sort_biaot_list)
    df=df[sort_biaot_list] #将最终表的列序按照设定的顺序排列
    return df


def get_col(x_df,colx):
    col0=['姓名','班级']
    col0.extend(colx.split(' '))
    df2=x_df[col0]
    df3=df2.loc[df2[colx]==df2[colx].max()]

    df3.reset_index(drop=True, inplace=True)#重置筛选后的索引
    df3=df3.T
  
    df3.index =['姓名','班级','最高分'] #重设行索引
    df3.columns = colx + df3.columns.astype(str) #重设列索引
    return df3

load_data()

yuwen_df=get_col(df,'语文')
shuxue_df=get_col(df,'数学')

print(yuwen_df)
yingyu_df=get_col(df,'英语')

wuli_df=get_col(df,'物理')

shengwu_df=get_col(df,'生物')

huaxue_df=get_col(df,'化学')

print(shuxue_df)
print(yingyu_df)
result=pd.merge(yuwen_df,shuxue_df,left_index=True, right_index=True, how='left')
result=pd.merge(result,yingyu_df,left_index=True, right_index=True, how='left')
result=pd.merge(result,wuli_df,left_index=True, right_index=True, how='left')
result=pd.merge(result,huaxue_df,left_index=True, right_index=True, how='left')
result=pd.merge(result,shengwu_df,left_index=True, right_index=True, how='left')
print(result)

输出结果与目标表格

输出结果与目标表格

免费评分

参与人数 1吾爱币 +1 热心值 +1 收起 理由
98jun + 1 + 1 我很赞同!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

 楼主| lvcaolhx 发表于 2019-11-16 19:02
get_col自定义涵数可以不用,直接用df['姓名','班级','语文'].max()最得语文最高分相关数据
最主要的输出成目标表格那样的格式
ds3700 发表于 2019-11-16 19:35
勇敢南山 发表于 2019-11-16 19:41
头像被屏蔽
jideco 发表于 2019-11-16 19:42
提示: 作者被禁止或删除 内容自动屏蔽
jidesheng6 发表于 2019-11-16 19:42
你用xlrd和xlwt就可以 pandas我不知道 还没了解过这模块 我之前写学校手机成绩表格就是这两个模块弄得
TIM截图20191116194133.png
ds3700 发表于 2019-11-16 19:43
jideco 发表于 2019-11-16 19:42
同感,用函数不就解决了吗

我是习惯用excel函数
ds3700 发表于 2019-11-16 19:44

嗯嗯 谢谢 看出来了 也懂点 自学的
唐子啊 发表于 2019-11-16 19:55
大二准备学
掌叶大黄 发表于 2019-11-16 20:07
用excel做更实用吧!毕竟教师多用它统计学生数据。
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-27 00:34

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表