实际处理的数据要比这个多而杂,现以下表为例。主打实用,大神勿喷。
思路:
1、对于出差的、2024年都排除掉,不参与统计。
2、把“月”中的12月888改为正常的12月。
3、以“姓名”中相同名字对应的年月进行拼接,并统计数量,并保存1.xlsx。
4、读1.xlsx,将列“Merged_年_月”中相同姓名所对应包含12月和10月的年份进行求合并, 并去掉年份。保存为2.xlsx。把统计的次数去掉保存为3.xlsx。
//一言不合就另存为。
数据模板:
姓名 | 部门 | 年 | 月 | 当月完成工作 |
刘一 | 采购部 | 2022年 | 1月 | 完成修炼科目1 |
刘一 | 采购部 | 2022年 | 2月 | 完成修炼科目2 |
刘一 | 采购部 | 2022年 | 3月 | 完成修炼科目3 |
刘一 | 采购部 | 2022年 | 4月 | 完成修炼科目4 |
刘一 | 采购部 | 2022年 | 5月 | 完成修炼科目5 |
刘一 | 采购部 | 2022年 | 6月 | 完成修炼科目6 |
刘一 | 采购部 | 2022年 | 7月 | 完成修炼科目7 |
刘一 | 采购部 | 2022年 | 8月 | 完成修炼科目8 |
刘一 | 采购部 | 2023年 | 9月 | 完成修炼科目7 |
刘一 | 采购部 | 2023年 | 10月 | 完成修炼科目8 |
刘一 | 采购部 | 2023年 | 11月 | 完成修炼科目9 |
刘一 | 采购部 | 2023年 | 12月 | 完成修炼科目10 |
刘一 | 采购部 | 2023年 | 9月 | 完成修炼科目11 |
刘一 | 采购部 | 2023年 | 10月 | 完成修炼科目12 |
刘一 | 采购部 | 2024年 | 11月 | 完成修炼科目13 |
刘一 | 采购部 | 2024年 | 12月 | 完成修炼科目14 |
刘一 | 采购部 | 2024年 | 9月 | 完成修炼科目15 |
刘一 | 采购部 | 2024年 | 10月 | 完成修炼科目16 |
刘一 | 采购部 | 2024年 | 11月 | 完成修炼科目17 |
刘一 | 采购部 | 2024年 | 12月888 | 完成修炼科目20 |
刘一 | 采购部 | 2024年 | 9月 | 完成修炼科目21 |
杨二 | 销售部 | 2022年 | 10月 | 完成修炼科目1 |
杨二 | 销售部 | 2022年 | 11月 | 完成修炼科目2 |
杨二 | 销售部 | 2022年 | 12月 | 出差 |
杨二 | 销售部 | 2022年 | 9月 | 完成修炼科目4 |
杨二 | 销售部 | 2022年 | 10月 | 完成修炼科目5 |
杨二 | 销售部 | 2022年 | 11月 | 完成修炼科目6 |
杨二 | 销售部 | 2022年 | 12月 | 完成修炼科目7 |
杨二 | 销售部 | 2022年 | 9月 | 完成修炼科目8 |
杨二 | 销售部 | 2022年 | 10月 | 完成修炼科目8 |
杨二 | 销售部 | 2022年 | 11月 | 完成修炼科目9 |
杨二 | 销售部 | 2022年 | 12月888 | 完成修炼科目10 |
杨二 | 销售部 | 2022年 | 9月 | 完成修炼科目11 |
杨二 | 销售部 | 2022年 | 10月 | 完成修炼科目12 |
杨二 | 销售部 | 2022年 | 11月 | 完成修炼科目13 |
杨二 | 销售部 | 2023年 | 12月 | 完成修炼科目14 |
杨二 | 销售部 | 2023年 | 9月 | 出差 |
杨二 | 销售部 | 2023年 | 10月 | 完成修炼科目16 |
杨二 | 销售部 | 2023年 | 11月 | 完成修炼科目17 |
杨二 | 销售部 | 2023年 | 12月888 | 完成修炼科目19 |
刘三 | 财务部 | 2024年 | 9月 | 完成修炼科目20 |
刘三 | 财务部 | 2024年 | 10月 | 完成修炼科目1 |
刘三 | 财务部 | 2022年 | 11月 | 完成修炼科目3 |
刘三 | 财务部 | 2022年 | 12月888 | 完成修炼科目4 |
刘三 | 财务部 | 2022年 | 9月 | 完成修炼科目5 |
刘三 | 财务部 | 2022年 | 10月 | 完成修炼科目6 |
刘三 | 财务部 | 2022年 | 11月 | 完成修炼科目7 |
刘三 | 财务部 | 2022年 | 12月 | 完成修炼科目8 |
刘三 | 财务部 | 2022年 | 9月 | 完成修炼科目7 |
刘三 | 财务部 | 2022年 | 10月 | 完成修炼科目8 |
刘三 | 财务部 | 2022年 | 11月 | 完成修炼科目10 |
刘三 | 财务部 | 2022年 | 12月 | 完成修炼科目11 |
刘三 | 财务部 | 2022年 | 9月 | 完成修炼科目12 |
刘三 | 财务部 | 2022年 | 10月 | 完成修炼科目13 |
刘三 | 财务部 | 2022年 | 11月 | 完成修炼科目14 |
刘三 | 财务部 | 2022年 | 12月 | 完成修炼科目15 |
刘三 | 财务部 | 2022年 | 9月 | 出差 |
刘三 | 财务部 | 2023年 | 10月 | 完成修炼科目17 |
刘三 | 财务部 | 2023年 | 11月 | 完成修炼科目19 |
刘三 | 财务部 | 2023年 | 12月 | 完成修炼科目20 |
刘三 | 财务部 | 2023年 | 9月 | 完成修炼科目2 |
刘三 | 财务部 | 2023年 | 10月 | 完成修炼科目3 |
刘三 | 财务部 | 2023年 | 11月 | 完成修炼科目4 |
刘三 | 财务部 | 2024年 | 12月 | 完成修炼科目5 |
刘三 | 财务部 | 2022年 | 9月 | 完成修炼科目6 |
刘三 | 财务部 | 2022年 | 10月 | 完成修炼科目7 |
刘三 | 财务部 | 2022年 | 11月 | 完成修炼科目8 |
刘三 | 财务部 | 2023年 | 12月 | 完成修炼科目10 |
刘三 | 财务部 | 2023年 | 9月 | 完成修炼科目11 |
刘三 | 财务部 | 2023年 | 10月 | 完成修炼科目12 |
刘三 | 财务部 | 2023年 | 11月 | 完成修炼科目13 |
刘三 | 财务部 | 2023年 | 12月 | 完成修炼科目15 |
刘三 | 财务部 | 2023年 | 9月 | 完成修炼科目16 |
刘三 | 财务部 | 2024年 | 10月 | 完成修炼科目17 |
刘三 | 财务部 | 2022年 | 11月 | 完成修炼科目19 |
刘三 | 财务部 | 2022年 | 12月 | 完成修炼科目20 |
刘三 | 财务部 | 2022年 | 9月 | 完成修炼科目1 |
刘三 | 财务部 | 2023年 | 10月 | 完成修炼科目2 |
刘三 | 财务部 | 2023年 | 11月 | 完成修炼科目3 |
刘三 | 财务部 | 2023年 | 12月 | 完成修炼科目4 |
刘三 | 财务部 | 2023年 | 9月 | 完成修炼科目5 |
刘三 | 财务部 | 2023年 | 10月 | 完成修炼科目6 |
刘三 | 财务部 | 2023年 | 11月 | 完成修炼科目7 |
刘三 | 财务部 | 2024年 | 12月 | 完成修炼科目8 |
刘三 | 财务部 | 2022年 | 9月 | 完成修炼科目7 |
刘三 | 财务部 | 2022年 | 10月 | 完成修炼科目8 |
刘三 | 财务部 | 2022年 | 11月 | 完成修炼科目9 |
刘三 | 财务部 | 2023年 | 12月 | 完成修炼科目10 |
刘三 | 财务部 | 2023年 | 9月 | 完成修炼科目11 |
刘三 | 财务部 | 2023年 | 10月 | 完成修炼科目12 |
刘三 | 财务部 | 2023年 | 11月 | 完成修炼科目13 |
刘三 | 财务部 | 2023年 | 12月 | 完成修炼科目14 |
输出结果展示
1.xlsx
2.xlsx
3.xlsx
想筛选自己想要的数据就得多加筛选条件,具体放在什么位置得看情况,主打就是一个变通。
还得一步一步的调试。
代码如下:
import pandas as pd
import re
def rename_on_keywords(text, keywords):
for keyword in keywords:
if keyword in text:
return keyword
return text
def merge_groups_on_keywords(text, keywords):
for keyword in keywords:
groups = re.findall(f'([^、]*{keyword}[^、]*\(\d+\))', text)
counts = [int(re.search('\((\d+)\)', group).group(1)) for group in groups]
if groups:
text = text.replace(groups[0], f'{keyword} ({sum(counts)})')
for group in groups[1:]:
text = text.replace('、' + group, '')
return text
# 读取 Excel 文件
df = pd.read_excel('kq.xlsx', engine='openpyxl')
# 列名定义
column1_name = '姓名'
column2_name = '年'
column3_name = '月'
column4_name = '当月完成工作'
column5_name = '年'
column6_name = '月'
column_to_rename = '月'
keywords = ['12月']
# 定义你想要排除的特定值列表
specific_values4 = ['出差']
specific_values5 = ['2024']
specific_values6 = ['11']
# 排除 'Column4' 和 'Column5' 中等于特定值列表的行
df = df[~df[column4_name].isin(specific_values4) & ~df[column5_name].isin(specific_values5)& ~df[column6_name].isin(specific_values6)]
# 对于每个 '姓名',在其对应的列中,找出包含特定关键字的唯一值,并将这些值替换为关键字本身
df[column_to_rename] = df.groupby(column1_name)[column_to_rename].transform(lambda x: x.apply(lambda y: rename_on_keywords(y, keywords)))
# 对 Column1 进行分组,并将每个组的 Column2 和 Column3 值合并为一个字符串,并计算每个字符串的出现次数
merged = df.groupby(column1_name).apply(lambda x: '、'.join([f'{v} ({c})' for v, c in (x[column2_name] + ' ' + x[column3_name]).value_counts().items()]))
# 将结果转换为 DataFrame
merged_df = merged.reset_index()
merged_df.columns = [column1_name, 'Merged_' + column2_name + '_' + column3_name]
# 将结果保存到新的 Excel 文件中
merged_df.to_excel('1.xlsx', index=False)
# 读取保存的 Excel 文件
df = pd.read_excel('1.xlsx')
# 列名定义
column2_name = 'Merged_年_月'
keywords = ['12月','10月']
# 对每个“用户名”对应的列中包含关键字的部分进行合并,并且重新命名为关键字,然后对次数进行求和
df[column2_name] = df[column2_name].apply(lambda x: merge_groups_on_keywords(x, keywords))
# 将最终结果保存到新的 Excel 文件中
df.to_excel('2.xlsx', index=False)
# 读取 Excel 文件
df = pd.read_excel('2.xlsx')
# 定义一个函数来去除括号里的次数
def remove_counts(text):
return re.sub(r'\s\(\d+\)', '', text)
# 列名定义
column_name = 'Merged_年_月'
# 去除次数
df[column_name] = df[column_name].apply(remove_counts)
# 将最终结果保存到新的 Excel 文件中
df.to_excel('3.xlsx', index=False)