IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Python知识库 -> Python Pandas 读取 Excel 表格处理出席表 -> 正文阅读

[Python知识库]Python Pandas 读取 Excel 表格处理出席表

一、思路

背景

EXCEL 表格中有每天大家到场的记录,每页格式相同,包含人名、日期和是否到场参加(也可线上)。如下:
在这里插入图片描述

思路

目标:统计每个人来了几次(进阶一点的话,包括线下线上)。

思路:(字典,pandas)

  1. 为了统计每个人来了几次。那就准备好一个字典,key是人名,value是次数。重名算同一个人;
  2. pandas 循环读取 EXCEL 文件中的每一页,得到一个包含“名字”,“次数”的二维列表;
  3. 把这个二维表中的数按人名统计到之前的字典中。

把 EXCEL 表格中的数据,按名字加一加个数,放到字典中

注意点:

  • 字典的操作:

    当统计一个名字出现的次数时,需要先读取字典中的值,再写回去。

    aud_count = Name_Dict.get(aud_name, 0)
    Name_Dict[aud_name] = aud_count + 1

    字典的排序,既可以根据 key 值排,也可以根据 value 值排。

    #根据名字首字符排序
    #Name_Dict_S = sorted(Name_Dict.items(), key=lambda x: x[0])
    #根据次数排序
    Name_Dict_S = sorted(Name_Dict.items(), key=lambda x: x[1])

  • EXCEL的读取:

    我用的是 Pandas 的 pd.read_excel() 函数来读取,里面各个参数如何使用这里不细讲。我只稍微指定了一下数据类型方便后续处理,其中日期的读取需要稍微钻研下。另外,数据源需要做好清洗,去除错乱值,避免函数报错。

    同时我使用了 mask 方法来过滤数据,区分线下线上。

    mask = Name_df[‘onsite’] == True
    Name_df_onsite = Name_df[(mask)]

  • 人名的处理: 正则表达式匹配出名字。如果是是中文的,直接匹配。如是英文的,中间会有大小写,空格。先把人名变成小写字母,再用正则表达式匹配出英文名字,这里多试试。

    name_low = name.lower()
    ret = re.search("([a-z]+\s{0,2}.?)+[a-z]+",name_l)

二、程序

导入 pandas 和 正则匹配模块。

import pandas as pd
import re

attendence_sum = 0 #总的参加人次,同一个人多次参加算多次
onsite_sum = 0 #总的到场的人次,同一人多次到场算多次

定义一个主函数,主函数中遍历每一页。从每一页得到一个名字列表,把每一名字和总的字典的名字作比较,有一样的就加1,说明这个人又参加了一次。遍历完了所有页就得到了每个名字出现的次数。

然后,按名字或次数排个序。

最后,按次数统计人名个数。即1次的几人,2次的几人,3次的几人,等等。

def main():

    # 打开文件
    file_path = r'C:\Auto Test\Auto_Name_Statistic\data\Name_Static.xlsx'
    # 页数
    pages = 18

    # 读取所有数据,统计每个名字出现的次数
    print('===================== 每场统计结果:')
    Name_Dict = {}
    for i in range(pages):
        # 每一页上的名字
        Name_Record = get_DF_from_file(i, file_path)
        lenth = Name_Record['name'].count()
        # print("debug -- ========== 共", lenth, "人")
        # 对每个名字处理
        for j in range(lenth):
            # 每个名字,提取英文小写字母
            aud_name = format_name(Name_Record['name'][j])
            # 查看该名字出现的次数
            aud_count = Name_Dict.get(aud_name, 0)
            Name_Dict[aud_name] = aud_count + 1

    # 排序打印
    sort_name(Name_Dict)
    
    # 统计参加1次的人数,2次的人数 ...
    static_audiance_attend_count(pages, Name_Dict)

用到了Pandas 去读取 Excel 文件,按每个 sheet 页读取,并统计这一页的人数

def get_DF_from_file(sheet_i, file_path):
    # 读取DF
    Name_df = pd.read_excel(file_path,
                            sheet_name=sheet_i, index_col=None,
                            dtype={'name': 'string', 'onsite': 'bool'},
                            # 解析指定列为日期
                            parse_dates=["date"],
                            # 指定如何解析,遇到格式不对的 errors 参数设置为:解析为NaT
                            # date_parser=lambda x: pd.to_datetime(x, format='%Y-%m-%d 00:00:00', errors='coerce'),
                            #  取excel的部分列
                            #  usecols=used_cols
                            )

    # 过滤 onsite 的人数
    global attendence_sum, onsite_sum
    attendence_count = Name_df.shape[0]
    attendence_sum += attendence_count

    # 做一个 mask 来过滤
    mask = Name_df['onsite'] == True
    Name_df_onsite = Name_df[(mask)]
    onsite_count = Name_df_onsite.shape[0]
    onsite_sum += onsite_count

    # 获取日期 [2,B] 这一格
    date_Tstamp = Name_df.iloc[1, 1]
    date_str = date_Tstamp._date_repr

    # 打印
    print('场次:', (sheet_i+1), ' - ', date_str, '        参与人数: ',
          attendence_count, '        Onsite 人数:', onsite_count)

    # 返回这一页上的名单
    return Name_df

正则匹配英文人名

# ************************************************************************************
# 功能:处理人名
# ************************************************************************************
def format_name(name):

    name_low = name.lower()
    # 正则匹配出小写英文名字
    ret = re.search("([a-z]+\s{0,2}\.?)+[a-z]+", name_low)
    if ret:
        aud_name = ret.group()
    else:
        print("debug -- ", name_low, ", resul ----------------- error")
        aud_name = 'error'
    return aud_name

字典排序

# ************************************************************************************
# 功能:对字典排序
# ************************************************************************************
def sort_name(Name_Dict):
    # 根据名字首字符排序
    # Name_Dict_S = sorted(Name_Dict.items(), key=lambda x: x[0])
    # 根据次数排序
    Name_Dict_S = sorted(Name_Dict.items(), key=lambda x: x[1])
    print('===================== 排序后统计结果:')
    for na in Name_Dict_S:
        print(na[0], ' : ', na[1])

再创建一个空字典,key 值是次数,value 值是人数。这个函数有点儿绕~

# ************************************************************************************
# 功能:统计参加1次的人数,2次的人数 。。。
# ************************************************************************************
def static_audiance_attend_count(pages, Name_Dict):
    # 准备一个空字典
    CountAdu_Dict = {}
    # 对每个名字进行处理,当前这个名字出现了 count 次。
    for name, count in Name_Dict.items():
        # 新字典中是否存在 count 次的记录?没有则为 0
        aud_amount = CountAdu_Dict.get(count, 0)
        # 记录 +1
        CountAdu_Dict[count] = aud_amount + 1

    # 排序后打印
    print("===================== 分次统计人数:")
    CountAdu_Dict_S = sorted(CountAdu_Dict.items(), key=lambda x: x[0])
    for item in CountAdu_Dict_S:
        print(item[0], '次: ', item[1], ' 人')
  Python知识库 最新文章
Python中String模块
【Python】 14-CVS文件操作
python的panda库读写文件
使用Nordic的nrf52840实现蓝牙DFU过程
【Python学习记录】numpy数组用法整理
Python学习笔记
python字符串和列表
python如何从txt文件中解析出有效的数据
Python编程从入门到实践自学/3.1-3.2
python变量
上一篇文章      下一篇文章      查看所有文章
加:2021-12-08 13:46:09  更:2021-12-08 13:47:20 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/16 5:48:33-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码