如何使用for循环递归创建Data Frame优化序列号处理代码
代码优化方案
完全可以通过for循环实现该逻辑,原代码重复度极高,仅位长、导出文件名等参数有差异,用循环重构后可大幅提升可维护性和扩展性,重构后代码如下:
import pandas as pd # 配置每位长的处理参数:(位长, 首次导出文件名, raw导出文件名, 是否存入待合并列表) length_config = [ (28, 'first.xlsx', 'raw.xlsx', True), (30, None, 'raw1.xlsx', True), (32, None, 'raw2.xlsx', True), (34, None, None, False) ] # 收集待合并的筛选后数据集 collect_dfs = [] for length, first_export_name, raw_export_name, need_collect in length_config: # 通用处理逻辑 data["Serial Number"] = data['Serial Number'].str.zfill(length) print(f"Fetch Serial Number with {length} characters") data["Output"] = data['Serial Number'].apply(lambda x: fetch_by_ser_no(x)) # 仅28位场景需要导出first.xlsx if first_export_name: data.to_excel(first_export_name, index=False) # 计算长度字段 data.loc[:,'itemlen'] = data["Output"].str.len() data.loc[:,'SNlen'] = data["Serial Number"].str.len() # 28/30/32位场景需要筛选数据、删除符合条件的行、导出raw文件 if raw_export_name: filtered_df = data.loc[(data['itemlen']== 1) & (data['SNlen'] == length)] data.drop(data[(data['SNlen'] == length) & (data['itemlen'] == 1)].index, inplace=True) filtered_df.to_excel(raw_export_name, index=False) if need_collect: collect_dfs.append(filtered_df) # 合并所有数据集,替换pandas 2.0+已废弃的append方法 data = pd.concat([data] + collect_dfs, ignore_index=False)
优化说明
- 所有重复逻辑收拢到循环内,后续新增位长处理仅需在
length_config中添加一行配置即可,无需重复写代码 - 避免手动定义
df/df1/df2这类冗余变量,用列表统一收集待合并数据集,逻辑更清晰 - 完全兼容原代码全部业务逻辑,导出文件名、筛选规则、合并逻辑和原代码完全一致
- 替换了pandas高版本已废弃的
DataFrame.append()方法,改用官方推荐的pd.concat(),兼容性更好
内容的提问来源于stack exchange,提问作者aditya
相关产品推荐
相关产品推荐

