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函数重命名列名,并输出结果。
# 第一步:导入相关模块
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]) # 平均分