【办公类-112-01】20250827儿童基本情况登记(运用deepseek的Python编程,实现excle数据匹配和提取判断)

背景需求:

保健老师打了两个语音电话,需求是:利用园园通下载托、小新生的所有数据,然后拆分成一个个班级的xlsx名单,发给新生班主任,班主任填写“儿童基本情况登记表”,发给保健老师。

因为还有十几位孩子8月新生数据没有进入园园通,所以我没有全部的数据,因此准备明天(26日)再登陆网页,看看数据完整情况。

但是下午,我想到之前有新插班生的人工填写上报数据(园园通不能园所自主添加孩子,都是上级把数据导入系统)。我完全可以把下载的园园通幼儿信息与手动填写数据合并。新生人数就满了(小班都是25人,6个班都满员了)

分析发现:

1、已有信息:

这张表姓名、性别、身份证号、出生年月、现居住地址(家庭地址)、家长姓名、手机号。都是可以直接从园园通下载的EXCEL里面找到相应的列。

2、学号:

园园通没有办法输入学号,所以下载excel中孩子有班级无学号,

所以根据”姓名“与“班级信息表(含有学号和姓名的点名册)”进行vlookup匹配。

3、户籍所在地(✔判断):

下载的园园通表格只有“户口省市、城市、地区”

所以需要根据”户口所在地区”判断

(1)如果是闵行区,就在"本区”勾选

(2)如果是上海其他区,就在“外区”勾选

        '黄浦区', '徐汇区', '长宁区', '静安区', '普陀区', '虹口区', '杨浦区',

        '浦东新区', '宝山区', '嘉定区', '金山区', '松江区', '青浦区', '奉贤区', '崇明区'    

如果“户口所在身份”非上海市”,就在“外地”勾选

思考完成后,开始具体操作

实现步骤:

1、园园通下载已有的新生名单,托班、小班新生正好在一分院、二分院

下载两个园区的所有新生名单

样式标题是

开始正式代码:

思路:

1:园园通下载的两个园区的新生名单

2:合并两个名单变成一个名单+手动补充插班生名单。

3:把带有学号的22个班级工作表的“班级信息表,放到这个文件夹里

4:匹配”班级信息表“和”园园通托小班信息合并“两个表中的姓名,把学号添加到”园园通托小班信息合并“的最左侧。获得匹配学号的xlsx

5:读取"匹配学号的xlsx"所有列和“2025学年出入园儿童基本信息表”,按照班级学号,把指定的信息写入“2025年表”,另存到(托小)2025的文件夹里。

6:因为现居住地址(都是闵行区)的长度太长,尝试去除重复的文字,缩减地址(少量重复词删除,居委会删除不了),可能考虑添加固定词组进行检索)本次还是老师手动删减

2.把两份xlsx合并在一起。

'''
20250825_2025_学年出入所(园)儿童基本情况登记  表一空  01
1、下载园园通新生名册.xls,把两个新生名册合并在一起
2、部分插班生信息手动添加
deepseek,阿夏
20250827
'''

import pandas as pd
import os
import re

def merge_and_format_excel():
    # 定义文件路径
    path = r'C:\Users\jg2yXRZ\OneDrive\桌面\_2025_学年出入所(园)儿童基本情况登记  表一空'
    folder_path = path + r"\园园通下载"
    output_path = path + r'\园园通托小班信息合并.xlsx'
    
    # 获取文件夹中的所有Excel文件
    excel_files = [f for f in os.listdir(folder_path) if f.endswith(('.xlsx', '.xls'))]
    
    if len(excel_files) < 2:
        print("234文件夹中Excel文件数量不足2个")
        return
    
    # 读取所有Excel文件
    dfs = []
    for file in excel_files[:2]:  # 只处理前两个文件
        file_path = os.path.join(folder_path, file)
        df = pd.read_excel(file_path)
        dfs.append(df)
        print(f"已读取文件: {file}")
    
    # 合并数据
    merged_df = pd.concat(dfs, ignore_index=True)
    
    # 格式化班级列(处理所有班级类型)
    def format_class_name(class_name):
        if pd.isna(class_name):
            return class_name
        
        class_str = str(class_name)
        
        # 定义班级类型和对应的前缀
        class_types = {
            '托班': '托', '托': '托',
            '小班': '小', '小': '小', 
            '中班': '中', '中': '中',
            '大班': '大', '大': '大'
        }
        
        # 中文数字到阿拉伯数字的映射
        chinese_to_arabic = {
            '一': '1', '二': '2', '三': '3', '四': '4', '五': '5',
            '六': '6', '七': '7', '八': '8', '九': '9', '十': '10',
            '1': '1', '2': '2', '3': '3', '4': '4', '5': '5',
            '6': '6', '7': '7', '8': '8', '9': '9', '10': '10'
        }
        
        # 尝试匹配各种班级格式
        patterns = [
            r'([托小中大])班(\S+?)班',  # 如:大班一班
            r'([托小中大])(\S+?)班',    # 如:大一班
            r'(\S+?)([托小中大])班',    # 如:一班大班
            r'([托小中大])班',          # 如:大班(没有具体班号)
        ]
        
        for pattern in patterns:
            match = re.search(pattern, class_str)
            if match:
                if len(match.groups()) >= 2:
                    # 有班级类型和班号
                    class_type = match.group(1)
                    class_num = match.group(2)
                    
                    # 获取班级前缀
                    prefix = class_types.get(class_type, class_type)
                    
                    # 转换班号
                    if class_num in chinese_to_arabic:
                        num = chinese_to_arabic[class_num]
                        return f"{prefix}{num}班"
                    else:
                        return f"{prefix}{class_num}班"
                else:
                    # 只有班级类型,没有班号
                    class_type = match.group(1)
                    prefix = class_types.get(class_type, class_type)
                    return f"{prefix}班"
        
        # 如果没有匹配到任何模式,返回原值
        return class_str
    
    # 查找包含班级信息的列
    class_columns = [col for col in merged_df.columns if any(keyword in col for keyword in ['班', 'class', '班级'])]
    
    if class_columns:
        for class_col in class_columns:
            print(f"检测到班级列: {class_col}")
            merged_df[class_col] = merged_df[class_col].apply(format_class_name)
    else:
        print("未检测到班级列,跳过格式转换")
    
    # 保存合并后的文件
    merged_df.to_excel(output_path, index=False)
    print(f"文件已保存至: {output_path}")
    print(f"合并完成,共{len(merged_df)}条记录")
    
    # 显示一些样本数据以供验证
    print("\n前5条数据的班级信息:")
    if class_columns:
        for class_col in class_columns:
            print(f"{class_col}列的前5个值:")
            print(merged_df[class_col].head().tolist())

# 执行函数
if __name__ == "
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

阿夏reasonsummer

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值