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 #科目表头
    default_cols=['语文','数学','外语','英语','物理','化学', '生物', '政治','历史', '地理']
    sort_kemu_list= #将科目表头按照设定的顺序排列
    source_biaot_list=sort_kemu_list
    sort_biaot_list= source_biaot_list
    print(sort_biaot_list)
    df=df #将最终表的列序按照设定的顺序排列
    return df
load_data()
#df==111]
def get_col(x_df,colx):
    col0=['姓名','班级']
    col0.extend(colx.split(' '))
    df2=x_df
   
    return df2.loc==df2.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 #科目表头
    default_cols=['语文','数学','外语','英语','物理','化学', '生物', '政治','历史', '地理']
    sort_kemu_list= #将科目表头按照设定的顺序排列
    source_biaot_list=sort_kemu_list
    sort_biaot_list= source_biaot_list
    print(sort_biaot_list)
    df=df #将最终表的列序按照设定的顺序排列
    return df


def get_col(x_df,colx):
    col0=['姓名','班级']
    col0.extend(colx.split(' '))
    df2=x_df
    df3=df2.loc==df2.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)

lvcaolhx 发表于 2019-11-16 19:02

get_col自定义涵数可以不用,直接用df['姓名','班级','语文'].max()最得语文最高分相关数据
最主要的输出成目标表格那样的格式

ds3700 发表于 2019-11-16 19:35

这是什么程序语言啊?

勇敢南山 发表于 2019-11-16 19:41

ds3700 发表于 2019-11-16 19:35
这是什么程序语言啊?

python来的

jideco 发表于 2019-11-16 19:42

jidesheng6 发表于 2019-11-16 19:42

你用xlrd和xlwt就可以 pandas我不知道 还没了解过这模块 我之前写学校手机成绩表格就是这两个模块弄得

ds3700 发表于 2019-11-16 19:43

jideco 发表于 2019-11-16 19:42
同感,用函数不就解决了吗

我是习惯用excel函数

ds3700 发表于 2019-11-16 19:44

勇敢南山 发表于 2019-11-16 19:41
python来的

嗯嗯 谢谢 看出来了 也懂点 自学的

唐子啊 发表于 2019-11-16 19:55

大二准备学

掌叶大黄 发表于 2019-11-16 20:07

用excel做更实用吧!毕竟教师多用它统计学生数据。
页: [1] 2
查看完整版本: 中学成绩分析-提取每科最高分学生名单