python中分条件查询统计excel数据

python统计打卡人数情况的数据,数据来源excel有多个表,sheet1-sheetN,每张表是每天登录显示的姓名,每张表A列都是姓名,不同的表出现的名字和顺序都有不同,需要统计所有名字在所有表中出现的次数,
但是因为有姓名相同,部门不同的情况,原有代码统计出来把两个同样姓名的人归到一条记录了,现在需要区别姓名和部门统计出现的人数


for w in all_ws:    
    for row in range(2, w.max_row-1):        
        if w['B'+str(row)].value not in res.keys():
                res.update({w['B'+str(row)].value:{'部门':w['C'+str(row)].value,
                           '出现次数':1}})        
        else:   
            res[w['B'+str(row)].value]['出现次数'] += 1

按照这段代码,输出结果是:
姓名 部门 出现次数
李明 人事部 10
王明 人事部 5

我想要达到的结果
统计在所有工作表中,所有的姓名出现的次数,在一个汇总表中显示,A列显示姓名,B列显示部门,C列显示姓名对应出现的次数
如:姓名 部门 出现次数
李明 人事部 7
李明 销售部 3
王明 人事部 5

可以使用Python的pandas库来读取Excel文件,并使用groupby和agg函数来统计每个人在不同表中出现的次数。具体实现方法如下

import pandas as pd

# 读取Excel文件中的所有表格
excel_file = pd.ExcelFile('your_excel_file.xlsx')
dfs = {sheet_name: excel_file.parse(sheet_name) for sheet_name in excel_file.sheet_names}

# 合并所有表格中的数据
df = pd.concat(dfs.values())

# 统计每个人在不同表格中出现的次数
result = df.groupby(['姓名', '部门']).agg({'部门': 'count'})

# 重命名列名
result.columns = ['出现次数']

# 输出结果
print(result)


在上面的代码中,首先使用pandas库的ExcelFile函数读取Excel文件中的所有表格,并使用concat函数将所有表格中的数据合并成一个DataFrame。然后使用groupby函数按照姓名和部门进行分组,并使用agg函数统计每个人在不同表格中出现的次数。最后使用rename函数重命名列名,并输出结果。

  • 这有个类似的问题, 你可以参考下: https://ask.csdn.net/questions/7677703
  • 以下回答由chatgpt基于相关博客总结生成:
    # 第一步:导入相关模块
    import xlrd
    import xlwt
    from xlutils.copy import copy
    # 第二步:打开Excel文件并读取对应的sheet数据
    wb = xlrd.open_workbook('score.xlsx')
    sh = wb.sheet_by_name(u'Sheet1')
    # 第三步:初始化统计数据,并开始按照要求统计
    stu_score = [] # 每位学生的成绩(三门课)
    sub_score = [] # 每门课的成绩
    for i in range(1, sh.nrows):
        stu = sh.cell_value(i, 0) # 获取学生姓名
        dep = sh.cell_value(i, 1) # 获取学生所属部门
        chi = sh.cell_value(i, 2) # 获取语文成绩
        mat = sh.cell_value(i, 3) # 获取数学成绩
        eng = sh.cell_value(i, 4) # 获取英语成绩
        # 开始按照要求统计每门课的最高分、最低分、平均成绩
        sub_score.append(chi)
        sub_score.append(mat)
        sub_score.append(eng)
        sub_score.sort()
        maxs = sub_score.pop() # 获取最高分
        mins = sub_score.pop(0) # 获取最低分
        avg = sum(sub_score)/len(sub_score) # 计算平均分
        # 开始按照要求统计每个学生的最高分、最低分、平均成绩
        stu_score.append([stu, dep, maxs]) # 存储最高分
        stu_score.append([stu, dep, mins]) # 存储最低分
        stu_score.append([stu, dep, avg]) # 存储平均分
    # 第四步:将统计结果写入新的Excel文件中
    workbook = xlwt.Workbook() # 新建Excel文件
    worksheet = workbook.add_sheet('Result') # 新建sheet,并命名
    # 写入表头
    worksheet.write(0, 0, '姓名')
    worksheet.write(0, 1, '部门')
    worksheet.write(0, 2, '成绩')
    # 开始写入统计数据
    for i in range(len(stu_score)):
        row = i+1 # 行数
        col = 0 # 每列的数据
        worksheet.write(row, col, stu_score[i][0]) # 姓名
        worksheet.write(row, col+1, stu_score[i][1]) # 部门
        worksheet.write(row, col+2, stu_score[i][2]) # 成绩
    # 最后保存Excel文件
    workbook.save('result.xls')
    

    注:以上代码只考虑了同名但在不同部门的情况,如果同名同部门的情况也需进行区分时,可以将列表存储成字典,使用格式如下:

    stu_score = {}
    stu_score[name_dep] = [maxs, mins, avg]
    

    其中name_dep可以使用姓名和部门信息拼接而成的字符串来作为字典的key值。然后在写入Excel文件中需要使用字典的items()函数来逐个写入数据,具体代码如下:

    # 写入表头
    worksheet.write(0, 0, '姓名')
    worksheet.write(0, 1, '部门')
    worksheet.write(0, 2, '最高分')
    worksheet.write(0, 3, '最低分')
    worksheet.write(0, 4, '平均分')
    # 开始写入统计数据
    for i, k in enumerate(stu_score):
        row = i+1 # 行数
        col = 0 # 每列的数据
        worksheet.write(row, col, k.split('_')[0]) # 姓名
        worksheet.write(row, col+1, k.split('_')[1]) # 部门
        worksheet.write(row, col+2, stu_score[k][0]) # 最高分
        worksheet.write(row, col+3, stu_score[k][1]) # 最低分
        worksheet.write(row, col+4, stu_score[k][2]) # 平均分