python识别excel表关键字分类
具体场景
该excel表格含有的信息为活动名,每场活动参与的人数,我需要通过看活动名称为活动分类,并且统计出不同类别活动参与的总人数以及每个类别下有多少场活动。
实现说明
因为数据量大,且标题名较为主观,所以决定通过关键字筛选的方法进行分类,同时需要进行多次人工筛选看出筛选出的不合理数据,修改要排除的关键词,最后才能得出较为满意的数据,最后会生成两张excel表,一张是整理好的活动那个分类数据,一张是分类的指标量化数据;
代码由gpt辅助生成
个人理解
我对这段代码的理解就是对每一行的活动名遍历一遍,看是否对的上字典里的exclude_keywords和keywords的,先看exclude_keywords,如果对的上exclude_keywords里的值那肯定是我要排除的,就不做分类了直接break,如果不是exclude_keywords就进行keywords的对比,对的上就把它跟分类好,主要是字典嵌套字典把这个遍历弄得有点绕了,但是结果没什么问题的。
代码展示
import pandas as pd
# 读取Excel文件
df = pd.read_excel("D:\\桌面文件.xlsx", engine='openpyxl')
# 分类标签、对应的关键词以及排除的关键词
categories = {
'法治': {
'keywords': ['民法', '宪法', '法律', '普法', '守法', '法治精神', '法治精神', '劳动法'],
'exclude_keywords': {'0'}
},
'国家意识': {
'keywords': ['国家', '家国', '爱国', '国家意识', '马克思主义', '升旗', '红色观影', '二十大精神', '中国式现代化'],
'exclude_keywords': {'国家学生资助', '劳育'}
},
'安全': {
'keywords': ['安全', '诈骗', '反诈'],
'exclude_keywords': {'0'}
},
'禁毒': {
'keywords': ['禁毒', '毒'],
'exclude_keywords': {'0'}
},
'艾滋病': {
'keywords': ['艾滋'],
'exclude_keywords': {'0'}
},
'近视': {
'keywords': ['爱眼', '近视', '眼睛健康'],
'exclude_keywords': {'0'}
},
'中华民族传统美德': {
'keywords': ['中华民族传统美德', '传统美德', '美德', '传统文化', '井冈山精神', '延安精神'],
'exclude_keywords': {'0'}
},
'科学素养': {
'keywords': ['科学素养', '科学', '核科技'],
'exclude_keywords': {'0'}
},
'劳动教育': {
'keywords': ['劳动教育', '劳动', '劳模', '工匠', '清洁', '清扫', '扫地', '打扫'],
'exclude_keywords': {'劳动法'}
},
'美育': {
'keywords': ['美育', '光影', '摄影', '微观之美'],
'exclude_keywords': {'0'}
},
'体育': {
'keywords': ['锻炼', '体育', '运动'],
'exclude_keywords': {'0'}
},
'读书活动': {
'keywords': ['读书', '阅读', '书香'],
'exclude_keywords': {'0'}
}
}
# 创建一个新列用于存储分类标签
df['分类'] = ''
# 对每一行的活动名称进行关键词匹配
for index, row in df.iterrows():
activity_name = str(row['活动名称']).lower()
# 检查是否包含排除的关键词
matched_category = None
for category, details in categories.items():
if not any(exclude_keyword in activity_name for exclude_keyword in details['exclude_keywords']):
# 如果没有找到排除关键词,则检查是否包含分类关键词
if any(keyword in activity_name for keyword in details['keywords']):
matched_category = category
break # 找到第一个匹配的分类就停止搜索
if matched_category is not None:
df.at[index, '分类'] = matched_category
# 使用 groupby 函数按分类分组,并计算活动数量和参与人数总和
grouped = df.groupby('分类').agg({'活动名称': 'count', '活动参加人次': 'sum'}).reset_index()
# 重命名列
grouped.columns = ['分类', '活动数量', '参与人数总和']
# 输出结果
print(grouped)
grouped.to_excel('分类结果14.xlsx', index=False, engine='openpyxl')
# 保存修改后的DataFrame到新的Excel文件
df.to_excel('第14次分类.xlsx', index=False, engine='openpyxl')