按email_id拆分DataFrame并按多列唯一值命名Excel文件
问题背景
现有如下示例DataFrame:
import pandas as pd data = pd.DataFrame({'email_id': ['abc@gmail.com;test1@gmail.com','abc@gmail.com;def@yahoo.com','abdc@gmail.com','ache@gmail.com','aqce@gmail.com','pqr@gmail.com','pqr@gmail.com'], 'Dept_id': [21,23,25,26,28,29,31], 'dept_name':['Science','Chemistry','Maths','Social','Physics','Botany','Zoology'], 'location':['KOR','ASN','ANZ','IND','AUS','NZ','NZ']})
需求
- 按
email_id列的唯一值拆分DataFrame - 拆分后的数据分别保存为Excel文件,每个唯一
email_id对应一个文件 - Excel文件名由对应分组的
Dept_id、dept_name、location列的唯一值组成(例如pqr@gmail.com分组的文件名应为29_31_Botany_Zoology_NZ.xlsx)
原代码问题
原代码能实现拆分,但文件名不符合要求,还存在两处报错点:
col_list未定义,调用to_excel时会触发NameError- 未调用
writer.save(),导致Excel文件无法正常保存或损坏
修正后的代码
import pandas as pd data = pd.DataFrame({'email_id': ['abc@gmail.com;test1@gmail.com','abc@gmail.com;def@yahoo.com','abdc@gmail.com','ache@gmail.com','aqce@gmail.com','pqr@gmail.com','pqr@gmail.com'], 'Dept_id': [21,23,25,26,28,29,31], 'dept_name':['Science','Chemistry','Maths','Social','Physics','Botany','Zoology'], 'location':['KOR','ASN','ANZ','IND','AUS','NZ','NZ']}) # 定义需要保存的列(不需要指定列可直接删除columns参数) col_list = ['email_id', 'Dept_id', 'dept_name', 'location'] for email, group in data.groupby('email_id'): # 提取各列唯一值并转为字符串,用下划线拼接 dept_ids = '_'.join(map(str, group['Dept_id'].unique())) dept_names = '_'.join(group['dept_name'].unique()) locations = '_'.join(group['location'].unique()) # 拼接符合要求的文件名 filename = f"{dept_ids}_{dept_names}_{locations}.xlsx" # 用with语句自动管理文件流,无需手动保存关闭 with pd.ExcelWriter(filename, engine='xlsxwriter') as writer: # 处理带分号的邮箱,取第一部分作为工作表名避免非法字符 sheet_name = email.split(';')[0] group.to_excel(writer, columns=col_list, sheet_name=sheet_name, index=False, startrow=1)
关键说明
- 用
map(str, ...)将数字类型的Dept_id转为字符串,避免拼接时出现类型错误 - 使用
with语句管理ExcelWriter,自动完成文件保存与关闭,避免资源泄漏 - 对包含分号的邮箱做拆分处理,避免工作表名出现Excel不支持的非法字符
内容的提问来源于stack exchange,提问作者The Great
相关产品推荐
相关产品推荐

