编写Python优先级合并函数遇问题,求处理重复公司疫苗状态数据
问题描述
现有一个包含10000行的数据集,格式如下:
Company_Names Vaccine_status Zebraniac au Done Zebraniac au Not Done Alons gm In Progress Endeven Tc Not Done Endeven Tc No Info
需要编写Python函数对存在重复公司名称的行进行合并:仅保留优先级最高的Vaccine_status记录,优先级顺序为 Done > Not Done > No Info > In Progress。例如Zebraniac au仅保留Done状态的行,删除Not Done状态的行。要求输入数据集后返回合并后的数据集。
解决方案
实现思路
- 定义状态优先级映射:用字典给每个状态分配权重,优先级越高的权重值越小,确保排序时高优先级状态排在前面。
- 按公司名称分组,每组内按状态优先级排序,取排序后的第一条记录即优先级最高的记录。
- 整理结果,移除临时权重列后返回。
Python 函数实现
假设输入数据集为pandas.DataFrame类型,代码如下:
import pandas as pd def merge_company_vaccine_status(df): # 定义状态优先级:权重越小优先级越高 status_priority = { 'Done': 0, 'Not Done': 1, 'No Info': 2, 'In Progress': 3 } # 添加优先级权重列 df['priority'] = df['Vaccine_status'].map(status_priority) # 按公司分组,每组内按优先级升序排序,取第一条记录 merged_df = df.sort_values(['Company_Names', 'priority']).groupby('Company_Names').first().reset_index() # 移除临时列,保留目标字段 merged_df = merged_df[['Company_Names', 'Vaccine_status']] return merged_df
代码说明
status_priority字典完成状态到权重的映射,保证高优先级状态在排序时更靠前。- 新增
priority列后,通过sort_values实现先按公司名称分组、再按优先级排序的逻辑。 groupby('Company_Names').first()提取每组优先级最高的记录,最后重置索引并清理临时列,得到最终合并结果。
使用示例
# 构造示例数据集 data = { 'Company_Names': ['Zebraniac au', 'Zebraniac au', 'Alons gm', 'Endeven Tc', 'Endeven Tc'], 'Vaccine_status': ['Done', 'Not Done', 'In Progress', 'Not Done', 'No Info'] } df = pd.DataFrame(data) # 调用函数 result_df = merge_company_vaccine_status(df) print(result_df)
输出结果:
Company_Names Vaccine_status 0 Alons gm In Progress 1 Endeven Tc Not Done 2 Zebraniac au Done
内容的提问来源于stack exchange,提问作者Patrik
相关产品推荐
相关产品推荐

