鱼C论坛

 找回密码
 立即注册
查看: 3296|回复: 8

【急】def函数的使用

[复制链接]
发表于 2021-4-19 13:12:22 | 显示全部楼层 |阅读模式
10鱼币
本帖最后由 lzymm1 于 2021-4-19 13:28 编辑

如题,如何将def函数运用到这段代码里面运行?
我之前想做一个排名统计的程序,参考了一段鱼友的代码做出如下的程序,但是不会把def函数代入其中。
程序要处理的是类似这样的一张普通登分表,然后输出一张有各科排名和九科总分、三科总分还有每个科目单独的排名sheet:
(鱼友的代码只能识别只有九科的登分表,然后我想灵活一点,多少科都能处理,做好了结果不会代入def函数emmm,因为没学过。于是想来求助一下)
考号
班别
姓名
语文
数学
外语
物理
化学
生物
历史
政治
地理
1
高二(1)班
46
45
75
98
76
54
32
43
54
2
高二(2)班
13
35
65
12
57
86
45
23
86
3
高二(3)班
12
80
57
68
45
76
79
67
68
4
高二(4)班
12
23
24
67
34
4
45
56
57
5
高二(5)班
54
23
56
86
56
75
45
34
57
6
高二(6)班
75
68
45
34
23
54
34
21
24
7
高二(7)班
67
89
0
90
43
98
78
67
33
8
高二(8)班
67
79
8
66
68
56
45
34
56
这是我的代码:
  1. # coding=utf-8
  2. import pandas as pd



  3. #识别登分表中含有的科目
  4. data = pd.read_excel(r'D:\Desktop\登分表.xls', index_col=0)
  5. columns = list(data.columns)
  6. subjects_list = ['语文','数学','英语','日语','外语','物理','化学','地理','生物','政治','历史']
  7. subjects = [i for i in columns if i in subjects_list]
  8. language_list = ['英语', '外语', '日语']
  9. language = [i for i in columns if i in language_list]
  10. Main_subjects = ['语文', '数学']

  11. #添加每一科的排名
  12. Personal_Information = columns.index(subjects[0])
  13. sequence = []
  14. for i in subjects:
  15.     data[i + '排名'] = data[i].rank(method='min', ascending=False)
  16.     sequence.append(i)
  17.     sequence.append(i+'排名')

  18. #检测是否含有主三科,如果有,计算三科总分。
  19. if (Main_subjects + language) < subjects:
  20.     Include = 'Yes'
  21.     data['三科总分'] = data['语文'] + data['数学'] + data[language[0]]
  22.     data['三科总分排名'] = data['三科总分'].rank(method = 'min',ascending = False)

  23. #计算所有科目总分,生成排名。
  24. data[str(len(subjects)) + '科总分'] = data.loc[:, subjects[0]:subjects[len(subjects)-1]].sum(axis=1)
  25. data[str(len(subjects)) + '科总分名次'] = data[str(len(subjects)) +'科总分'].rank(method='min', ascending=False)
  26. data.sort_values(by=str(len(subjects)) + "科总分名次", inplace=True)

  27. #整理顺序
  28. if Include == 'Yes':
  29.     Add = ['三科总分', '三科总分排名', str(len(subjects)) + '科总分',str(len(subjects)) + '科总分名次']
  30. else:
  31.     Add = [str(len(subjects)) + '科总分', str(len(subjects)) + '科总分名次']
  32. All = list(set(columns) - set(subjects)) + sequence + Add
  33. data = data.loc[:, All]

  34. #新增已有科目的单科排名sheet
  35. with pd.ExcelWriter(r'D:\Desktop\成绩统计.xls') as writer:
  36.     data.to_excel(writer, sheet_name='所有科目')
  37.     for i in subjects:
  38.         rank = i + '排名'
  39.         PI_list = list(set(columns) - set(subjects))
  40.         PI_list2 = PI_list
  41.         PI_list2.append(i)
  42.         PI_list2.append(rank)
  43.         single_subject_ranking = data.loc[:,PI_list2 ]
  44.         single_subject_ranking.sort_values(by=rank, inplace=True)
  45.         single_subject_ranking.to_excel(writer,sheet_name=rank)
  46.         PI_list2.clear()
复制代码






这是鱼友的代码:
  1. # coding=utf-8
  2. import pandas as pd
  3. import easygui as g
  4. import sys


  5. #选择原文件路径


  6. def get_file():
  7.     confirm = g.ccbox(msg="程序简介 & 注意事项: \n\n 1.本程序可以根据Excel登分表一键生成九科总分排名以及单科排名。选择或保存文件时,   左上角会有提示,请注意左上角小标题。\n2.本程序设计初衷是为了分担老师们的排名统计工作,未经允许严禁用于商用。\n\n\n      &#9900; 注意事项:登分表内必须有且仅有\n      ‘考号’‘班别’‘姓名’‘语文’‘数学’‘外语’\n      ‘物理’‘历史’‘生物’‘地理’‘政治’‘化学’。\n        但无需按照顺序排列,本程序会自动排序。\n\n\n\n                           准备好后请单击“下一步”",
  8.                       title='学生成绩统计程序', choices=('下一步', '退出'))
  9.     if confirm == True:

  10.         file = g.fileopenbox(msg='', title='请选择登分表Excel文件',
  11.                              default=r'C:\\', filetypes=['*.xlsx'])
  12.         if file == None or file == '.':
  13.             sys.exit()
  14.         else:
  15.             return file
  16.     else:
  17.         sys.exit()


  18. #得到所有科目
  19. def get_subject(data):
  20.     km = ['语文', '数学', '外语', '物理', '化学', '生物', '政治', '历史', '地理']
  21.     all_subject = []
  22.     for subject in data.columns:
  23.         if subject in km:
  24.             all_subject.append(subject)

  25.     return all_subject


  26. #猎取单科数据 ID + 班别 + 姓名 + 本科目的成绩 + 排名
  27. def get_series(kem, orig, savep):

  28.     with pd.ExcelWriter(savep) as writer:
  29.         orig.to_excel(writer, sheet_name='所有科目')

  30.         for i in kem:
  31.             pm = i + '名次'
  32.             df_dk = orig.loc[:, ['班别', '姓名', i, pm]]
  33.             df_dk.sort_values(by=pm, inplace=True)
  34.             df_dk.to_excel(writer, sheet_name=i)


  35. def edit_all(data1):

  36.     for kemu in data1.columns[2:]:
  37.         data1[kemu+'名次'] = data1[kemu].rank(method='min', ascending=False)

  38.     data1['3科总分'] = data1['语文'] + data1['数学'] + data1['外语']
  39.     data1['3科总分名次'] = data1['3科总分'].rank(method='min', ascending=False)

  40.     data1['9科总分'] = data1.loc[:, '语文':'地理'].sum(axis=1)
  41.     data1['9科总分名次'] = data1['9科总分'].rank(method='min', ascending=False)

  42.     data1.sort_values(by="9科总分名次", inplace=True)

  43.     data2 = data1.loc[:, ['班别', '姓名', '语文', '语文名次', '数学', '数学名次',
  44.                           '外语', '外语名次', '物理', '物理名次', '化学', '化学名次',
  45.                           '生物', '生物名次', '政治', '政治名次', '历史', '历史名次',
  46.                           '地理', '地理名次', '3科总分', '3科总分名次', '9科总分', '9科总分名次']]

  47.     return data2


  48. excel_file = get_file()
  49. df1 = pd.read_excel(excel_file, index_col=0)
  50. df2 = edit_all(df1)
  51. allkm = get_subject(df1)
  52. sp = g.filesavebox(msg='请选择保存路径及输入保存文件名(注:默认为“成绩统计表”。不需要写后缀).',
  53.                    title='学生成绩统计程序', default=r'成绩统计表', filetypes=['*.xlsx'])
  54. spp = sp + '.xlsx'
  55. get_series(allkm, df2, spp)
  56. g.msgbox("文件保存成功,感谢您的使用!\n\n\n\n\n\n                         更多功能正在开发中....\n\n                       作者:xxx\n\n\n                                                           版本号:2020/12/23", '学生成绩统计程序')
复制代码







该怎样改写呢?能请你帮助我一下吗?



想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-4-19 19:08:18 | 显示全部楼层
数据录入部分,我就不写了,统计部分,我会这样写:
  1. import pandas as pd
  2. df = pd.read_excel('分数统计.xlsx')
  3. df
  4. # 函数封装(统计和保存结果)
  5. def tj(df, file_name='分数统计结果_默认.xlsx'):
  6.     #
  7.     s1 = df.iloc[:, 3:].sum(axis=1)  # 九科总分
  8.     s2 = df.iloc[:, 3:6].sum(axis=1)   # 语数英三科总分
  9.     df_z = pd.concat([df.iloc[:, :3], s1, s2], axis=1)
  10.     df_z.columns = list(df.columns[:3]) + ['九科总成绩', '语数英总成绩']
  11.     print(df_z)

  12.     #
  13.     df_yw = df.iloc[:, :4].sort_values(by=['语文'], ascending=False)
  14.     df_yw['排名'] = df_yw['语文'].rank(method='min', ascending=False)

  15.     #
  16.     df_sx = pd.concat([df.iloc[:, 0:3], df.iloc[:, 4]], axis=1)
  17.     print(df_sx)
  18.     df_sx.sort_values(by=['数学'], ascending=False, inplace=True)   
  19.     df_sx['排名'] = df_sx['数学'].rank(method='min', ascending=False)

  20.     # 保存结果,分别写到不同的sheet
  21.     with pd.ExcelWriter(path=file_name) as writer:
  22.         df.to_excel(writer, sheet_name='原数据', index=False)
  23.         df_z.to_excel(writer, sheet_name='总成绩', index=False)
  24.         df_yw.to_excel(writer, sheet_name='语文', index=False)
  25.         df_sx.to_excel(writer, sheet_name='数学', index=False)

  26. tj(df)
复制代码


---仅供参考。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-4-19 20:48:06 | 显示全部楼层
阿奇_o 发表于 2021-4-19 19:08
数据录入部分,我就不写了,统计部分,我会这样写:

谢谢。我按着你的改了一下,好像有哪里我没处理好,然后他输出了None
请问这是哪弄错了

  1. import pandas as pd
  2. data = pd.read_excel(r'C:\Users\Administrator.USER-20180926UF\Desktop\桌面文件\test\登分表\登分表.xlsx')

  3. #识别登分表中含有的科目
  4. def count(data,file_name='分数统计结果_默认.xlsx'):
  5.     columns = list(data.columns)
  6.     subjects_list = ['语文','数学','英语','日语','外语','物理','化学','地理','生物','政治','历史']
  7.     subjects = [i for i in columns if i in subjects_list]
  8.     language_list = ['英语', '外语', '日语']
  9.     language = [i for i in columns if i in language_list]
  10.     Main_subjects = ['语文', '数学']

  11.     #添加每一科的排名
  12.     Personal_Information = columns.index(subjects[0])
  13.     sequence = []
  14.     for i in subjects:
  15.         data[i + '排名'] = data[i].rank(method='min', ascending=False)
  16.         sequence.append(i)
  17.         sequence.append(i+'排名')

  18.     #检测是否含有主三科,如果有,计算三科总分。
  19.     if (Main_subjects + language) < subjects:
  20.         Include = 'Yes'
  21.         data['三科总分'] = data['语文'] + data['数学'] + data[language[0]]
  22.         data['三科总分排名'] = data['三科总分'].rank(method = 'min',ascending = False)

  23.     #计算所有科目总分,生成排名。
  24.     data[str(len(subjects)) + '科总分'] = data.loc[:, subjects[0]:subjects[len(subjects)-1]].sum(axis=1)
  25.     data[str(len(subjects)) + '科总分名次'] = data[str(len(subjects)) +'科总分'].rank(method='min', ascending=False)
  26.     data.sort_values(by=str(len(subjects)) + "科总分名次", inplace=True)

  27.     #整理顺序
  28.     if Include == 'Yes':
  29.         Add = ['三科总分', '三科总分排名', str(len(subjects)) + '科总分',str(len(subjects)) + '科总分名次']
  30.     else:
  31.         Add = [str(len(subjects)) + '科总分', str(len(subjects)) + '科总分名次']
  32.     All = list(set(columns) - set(subjects)) + sequence + Add
  33.     data = data.loc[:, All]

  34.     #新增已有科目的单科排名sheet
  35.     with pd.ExcelWriter(path=file_name) as writer:
  36.         data.to_excel(writer, sheet_name='所有科目')
  37.         for i in subjects:
  38.             rank = i + '排名'
  39.             PI_list = list(set(columns) - set(subjects))
  40.             PI_list2 = PI_list
  41.             PI_list2.append(i)
  42.             PI_list2.append(rank)
  43.             single_subject_ranking = data.loc[:,PI_list2 ]
  44.             single_subject_ranking.sort_values(by=rank, inplace=True)
  45.             single_subject_ranking.to_excel(writer,sheet_name=rank)
  46.             PI_list2.clear()

  47. print(count(data))
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-4-19 23:06:02 | 显示全部楼层
lzymm1 发表于 2021-4-19 20:48
谢谢。我按着你的改了一下,好像有哪里我没处理好,然后他输出了None
请问这是哪弄错了{:10_2 ...


没有return ,当然默认就是返回 None 呀。我那是把结果都写到excel里了。

你去菜鸟教程,先看看基本的自定义函数怎么用吧,

一下整一大堆,即使搞出来,也掌握不了关键的知识。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-4-19 23:35:37 | 显示全部楼层
另外,这句 if (Main_subjects + language) < subjects:
谁教你的,这具体是什么意思,清楚么。。

我还是第一次见。。于是去查了查并试验一下才知道,原来是依次每两个元素进行比较,是否相同……
这应该很少场景会用到的比较方式,不是判断是否包含(求子集便捷的方法是用集合的方法issubset())。
  1. In [13]: ['a', 'b', 'd'] < ['a', 'b', 'c', 'd']
  2. Out[13]: False

  3. In [14]: set(['a', 'b', 'd']).issubset( set(['a', 'b', 'c', 'd']))
  4. Out[14]: True
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-4-20 21:16:13 | 显示全部楼层
新建一个def函数,命名为zongfen
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-4-21 12:02:09 | 显示全部楼层
xiaoyouzi11 发表于 2021-4-20 21:16
新建一个def函数,命名为zongfen

但是要返回哪一个值呢?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-4-21 12:19:44 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-5-25 17:23:51 | 显示全部楼层
lzymm1 发表于 2021-4-19 20:48
谢谢。我按着你的改了一下,好像有哪里我没处理好,然后他输出了None
请问这是哪弄错了{:10_2 ...

要有 return 或者用 global
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-5-15 02:06

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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