利用 Pandas 进行 班级德育分 个人分计算

使用Pandas == 1.5.3

班干部打德育分太辛苦了我给他们写个自动算总分的程序

  • 昨天给我们的班干部 打德育分 总分算的是非常的坐牢
  • 所以我决定写个小程序 帮助一下我们的班干部

20231107131400
20231107131400

数据也是非常不好啊

Main 主程序

  • main.py 里面写了程序的小入口
import pandas as pd
import re
import tkinter.filedialog
from DefaultScore import DefaultScoreForMonthStart
from ScoreMonthEnd import score_month_end


def month_start():
    file_path = tkinter.filedialog.askopenfilename(title='打开源文件')

    # 读选中的文件
    df = pd.read_excel(file_path, index_col=0)
    # 保存文件的位置
    save_file_path = tkinter.filedialog.asksaveasfilename(defaultextension='.xlsx', title='另存为文件',
                                                          filetypes=[('所有文件', '.xlsx')])
    DefaultScoreForMonthStart(df=df, save_file_path=save_file_path)


def month_end():
    file_path = tkinter.filedialog.askopenfilename(title='打开上一周文件')

    # 读选中的文件
    df = pd.read_excel(file_path, index_col=0)
    # 保存文件的位置
    save_file_path = tkinter.filedialog.asksaveasfilename(defaultextension='.xlsx', title='另存为文件',
                                                          filetypes=[('所有文件', '.xlsx')])
    score_month_end(df=df, save_file_path=save_file_path)


if __name__ == '__main__':
    for i in range(10):
        print("欢迎使用本程序")
        print("1.现在为月初(默认分数为75)")
        print("2.现在为月中默认分数为上周的总分(需要导入上周的数据)")
        print("退出请输入3, 超过10次未输入正确则退出程序")

        user_input = input("请输入你现在的情况(输入1或者2):")
        if user_input == '1':
            try:
                month_start()
            except Exception as e:
                print("报错", e)

        elif user_input == '2':
            try:
                month_end()
            except Exception as e:
                print("报错", e)

        elif user_input == '3':
            print("用户指令退出!")
            break
        else:
            print("不明白你在输入什么,请重新输入!")

定义了两个小函数 调用了另外两个文件里小模块

还使用了tk里的 filedialog 里面的askopenfilename方法用来打开文件路径

asksaveasfilename 放保存文件

ScoreMonthEnd

def score_month_end(df, save_file_path):
    student_score_m = []

    # 处理每格分数
    def cnm(s):
        a = re.findall(r'(-\d+|\+\d+)', str(s))
        operations = [int(match) for match in a]
        sum_sb = sum(operations)
        if operations:
            return sum_sb
        else:
            return 0

    # 计算班级每人的分数
    for i in range(1, 46):
        try:
            df_student = df.loc[i, '周一':'加减分']
            student_data = df_student.apply(cnm)
            a = student_data.values.sum()
            student_score_m.append(a)
        except:
            continue
    score = df.loc[:,['姓名',"总分"]]
    score.loc[:,"本周分数"] = student_score_m
    score.rename(columns={"总分":"上周分数", '本周分数':"本周扣分"}, inplace=True)
    score.loc[:,"本周分数"] = score[['上周分数', '本周扣分']].sum(axis=1)
    score = score.loc[:,"本周分数"]
    # 把df复制给student_score
    student_score = df
    student_score.loc[:,"本周分数"] = score
    student_score.rename(columns={"总分": "上周分数"}, inplace=True)

    # 保存
    student_score.to_excel(save_file_path)

DefaultScore

def DefaultScoreForMonthStart(df, save_file_path):
    student_score = []

    # 处理每格分数
    def cnm(s):
        a = re.findall(r'(-\d+|\+\d+)', str(s))
        operations = [int(match) for match in a]
        sum_sb = sum(operations)
        if operations:
            return sum_sb
        else:
            return 0

    # 计算班级每人的分数
    for i in range(1, 46):
        try:
            df_student = df.loc[i, '周一':'加减分']
            student_data = df_student.apply(cnm)
            a = student_data.values.sum() + 75
            student_score.append(a)
        except:
            continue

    # 将已经算好的总分放入表格
    MonthStart = df
    MonthStart.loc[:, "总分"] = student_score

    MonthStart.to_excel(save_file_path)