【急】def函数的使用
本帖最后由 lzymm1 于 2021-4-19 13:28 编辑如题,如何将def函数运用到这段代码里面运行?
我之前想做一个排名统计的程序,参考了一段鱼友的代码做出如下的程序,但是不会把def函数代入其中。
程序要处理的是类似这样的一张普通登分表,然后输出一张有各科排名和九科总分、三科总分还有每个科目单独的排名sheet:
(鱼友的代码只能识别只有九科的登分表,然后我想灵活一点,多少科都能处理,做好了结果不会代入def函数emmm,因为没学过。于是想来求助一下)
考号班别姓名语文数学外语物理化学生物历史政治地理
1高二(1)班梁464575987654324354
2高二(2)班张133565125786452386
3高二(3)班李128057684576796768
4高二(4)班吴12232467344455657
5高二(5)班秦542356865675453457
6高二(6)班张756845342354342124
7高二(7)班魏67890904398786733
8高二(8)班瑾67798666856453456
这是我的代码:
# coding=utf-8
import pandas as pd
#识别登分表中含有的科目
data = pd.read_excel(r'D:\Desktop\登分表.xls', index_col=0)
columns = list(data.columns)
subjects_list = ['语文','数学','英语','日语','外语','物理','化学','地理','生物','政治','历史']
subjects =
language_list = ['英语', '外语', '日语']
language =
Main_subjects = ['语文', '数学']
#添加每一科的排名
Personal_Information = columns.index(subjects)
sequence = []
for i in subjects:
data = data.rank(method='min', ascending=False)
sequence.append(i)
sequence.append(i+'排名')
#检测是否含有主三科,如果有,计算三科总分。
if (Main_subjects + language) < subjects:
Include = 'Yes'
data['三科总分'] = data['语文'] + data['数学'] + data]
data['三科总分排名'] = data['三科总分'].rank(method = 'min',ascending = False)
#计算所有科目总分,生成排名。
data = data.loc[:, subjects:subjects].sum(axis=1)
data = data.rank(method='min', ascending=False)
data.sort_values(by=str(len(subjects)) + "科总分名次", inplace=True)
#整理顺序
if Include == 'Yes':
Add = ['三科总分', '三科总分排名', str(len(subjects)) + '科总分',str(len(subjects)) + '科总分名次']
else:
Add =
All = list(set(columns) - set(subjects)) + sequence + Add
data = data.loc[:, All]
#新增已有科目的单科排名sheet
with pd.ExcelWriter(r'D:\Desktop\成绩统计.xls') as writer:
data.to_excel(writer, sheet_name='所有科目')
for i in subjects:
rank = i + '排名'
PI_list = list(set(columns) - set(subjects))
PI_list2 = PI_list
PI_list2.append(i)
PI_list2.append(rank)
single_subject_ranking = data.loc[:,PI_list2 ]
single_subject_ranking.sort_values(by=rank, inplace=True)
single_subject_ranking.to_excel(writer,sheet_name=rank)
PI_list2.clear()
这是鱼友的代码:
# coding=utf-8
import pandas as pd
import easygui as g
import sys
#选择原文件路径
def get_file():
confirm = g.ccbox(msg="程序简介 & 注意事项: \n\n 1.本程序可以根据Excel登分表一键生成九科总分排名以及单科排名。选择或保存文件时, 左上角会有提示,请注意左上角小标题。\n2.本程序设计初衷是为了分担老师们的排名统计工作,未经允许严禁用于商用。\n\n\n ⚬ 注意事项:登分表内必须有且仅有\n ‘考号’‘班别’‘姓名’‘语文’‘数学’‘外语’\n ‘物理’‘历史’‘生物’‘地理’‘政治’‘化学’。\n 但无需按照顺序排列,本程序会自动排序。\n\n\n\n 准备好后请单击“下一步”",
title='学生成绩统计程序', choices=('下一步', '退出'))
if confirm == True:
file = g.fileopenbox(msg='', title='请选择登分表Excel文件',
default=r'C:\\', filetypes=['*.xlsx'])
if file == None or file == '.':
sys.exit()
else:
return file
else:
sys.exit()
#得到所有科目
def get_subject(data):
km = ['语文', '数学', '外语', '物理', '化学', '生物', '政治', '历史', '地理']
all_subject = []
for subject in data.columns:
if subject in km:
all_subject.append(subject)
return all_subject
#猎取单科数据 ID + 班别 + 姓名 + 本科目的成绩 + 排名
def get_series(kem, orig, savep):
with pd.ExcelWriter(savep) as writer:
orig.to_excel(writer, sheet_name='所有科目')
for i in kem:
pm = i + '名次'
df_dk = orig.loc[:, ['班别', '姓名', i, pm]]
df_dk.sort_values(by=pm, inplace=True)
df_dk.to_excel(writer, sheet_name=i)
def edit_all(data1):
for kemu in data1.columns:
data1 = data1.rank(method='min', ascending=False)
data1['3科总分'] = data1['语文'] + data1['数学'] + data1['外语']
data1['3科总分名次'] = data1['3科总分'].rank(method='min', ascending=False)
data1['9科总分'] = data1.loc[:, '语文':'地理'].sum(axis=1)
data1['9科总分名次'] = data1['9科总分'].rank(method='min', ascending=False)
data1.sort_values(by="9科总分名次", inplace=True)
data2 = data1.loc[:, ['班别', '姓名', '语文', '语文名次', '数学', '数学名次',
'外语', '外语名次', '物理', '物理名次', '化学', '化学名次',
'生物', '生物名次', '政治', '政治名次', '历史', '历史名次',
'地理', '地理名次', '3科总分', '3科总分名次', '9科总分', '9科总分名次']]
return data2
excel_file = get_file()
df1 = pd.read_excel(excel_file, index_col=0)
df2 = edit_all(df1)
allkm = get_subject(df1)
sp = g.filesavebox(msg='请选择保存路径及输入保存文件名(注:默认为“成绩统计表”。不需要写后缀).',
title='学生成绩统计程序', default=r'成绩统计表', filetypes=['*.xlsx'])
spp = sp + '.xlsx'
get_series(allkm, df2, spp)
g.msgbox("文件保存成功,感谢您的使用!\n\n\n\n\n\n 更多功能正在开发中....\n\n 作者:xxx\n\n\n 版本号:2020/12/23", '学生成绩统计程序')
该怎样改写呢?能请你帮助我一下吗?
数据录入部分,我就不写了,统计部分,我会这样写:
import pandas as pd
df = pd.read_excel('分数统计.xlsx')
df
# 函数封装(统计和保存结果)
def tj(df, file_name='分数统计结果_默认.xlsx'):
#
s1 = df.iloc[:, 3:].sum(axis=1)# 九科总分
s2 = df.iloc[:, 3:6].sum(axis=1) # 语数英三科总分
df_z = pd.concat(, s1, s2], axis=1)
df_z.columns = list(df.columns[:3]) + ['九科总成绩', '语数英总成绩']
print(df_z)
#
df_yw = df.iloc[:, :4].sort_values(by=['语文'], ascending=False)
df_yw['排名'] = df_yw['语文'].rank(method='min', ascending=False)
#
df_sx = pd.concat(, df.iloc[:, 4]], axis=1)
print(df_sx)
df_sx.sort_values(by=['数学'], ascending=False, inplace=True)
df_sx['排名'] = df_sx['数学'].rank(method='min', ascending=False)
# 保存结果,分别写到不同的sheet
with pd.ExcelWriter(path=file_name) as writer:
df.to_excel(writer, sheet_name='原数据', index=False)
df_z.to_excel(writer, sheet_name='总成绩', index=False)
df_yw.to_excel(writer, sheet_name='语文', index=False)
df_sx.to_excel(writer, sheet_name='数学', index=False)
tj(df)
---仅供参考。 阿奇_o 发表于 2021-4-19 19:08
数据录入部分,我就不写了,统计部分,我会这样写:
谢谢。我按着你的改了一下,好像有哪里我没处理好,然后他输出了None{:10_250:}
请问这是哪弄错了{:10_266:}
import pandas as pd
data = pd.read_excel(r'C:\Users\Administrator.USER-20180926UF\Desktop\桌面文件\test\登分表\登分表.xlsx')
#识别登分表中含有的科目
def count(data,file_name='分数统计结果_默认.xlsx'):
columns = list(data.columns)
subjects_list = ['语文','数学','英语','日语','外语','物理','化学','地理','生物','政治','历史']
subjects =
language_list = ['英语', '外语', '日语']
language =
Main_subjects = ['语文', '数学']
#添加每一科的排名
Personal_Information = columns.index(subjects)
sequence = []
for i in subjects:
data = data.rank(method='min', ascending=False)
sequence.append(i)
sequence.append(i+'排名')
#检测是否含有主三科,如果有,计算三科总分。
if (Main_subjects + language) < subjects:
Include = 'Yes'
data['三科总分'] = data['语文'] + data['数学'] + data]
data['三科总分排名'] = data['三科总分'].rank(method = 'min',ascending = False)
#计算所有科目总分,生成排名。
data = data.loc[:, subjects:subjects].sum(axis=1)
data = data.rank(method='min', ascending=False)
data.sort_values(by=str(len(subjects)) + "科总分名次", inplace=True)
#整理顺序
if Include == 'Yes':
Add = ['三科总分', '三科总分排名', str(len(subjects)) + '科总分',str(len(subjects)) + '科总分名次']
else:
Add =
All = list(set(columns) - set(subjects)) + sequence + Add
data = data.loc[:, All]
#新增已有科目的单科排名sheet
with pd.ExcelWriter(path=file_name) as writer:
data.to_excel(writer, sheet_name='所有科目')
for i in subjects:
rank = i + '排名'
PI_list = list(set(columns) - set(subjects))
PI_list2 = PI_list
PI_list2.append(i)
PI_list2.append(rank)
single_subject_ranking = data.loc[:,PI_list2 ]
single_subject_ranking.sort_values(by=rank, inplace=True)
single_subject_ranking.to_excel(writer,sheet_name=rank)
PI_list2.clear()
print(count(data)) lzymm1 发表于 2021-4-19 20:48
谢谢。我按着你的改了一下,好像有哪里我没处理好,然后他输出了None
请问这是哪弄错了{:10_2 ...
没有return ,当然默认就是返回 None 呀。我那是把结果都写到excel里了。
你去菜鸟教程,先看看基本的自定义函数怎么用吧,
一下整一大堆,即使搞出来,也掌握不了关键的知识。 另外,这句 if (Main_subjects + language) < subjects:
谁教你的,这具体是什么意思,清楚么。。
我还是第一次见。。于是去查了查并试验一下才知道,原来是依次每两个元素进行比较,是否相同……
这应该很少场景会用到的比较方式,不是判断是否包含(求子集便捷的方法是用集合的方法issubset())。
In : ['a', 'b', 'd'] < ['a', 'b', 'c', 'd']
Out: False
In : set(['a', 'b', 'd']).issubset( set(['a', 'b', 'c', 'd']))
Out: True 新建一个def函数,命名为zongfen xiaoyouzi11 发表于 2021-4-20 21:16
新建一个def函数,命名为zongfen
但是要返回哪一个值呢? {:5_105:} lzymm1 发表于 2021-4-19 20:48
谢谢。我按着你的改了一下,好像有哪里我没处理好,然后他输出了None
请问这是哪弄错了{:10_2 ...
要有 return 或者用 global
页:
[1]