基于Excel多工作表自动生成Python区间转换函数的需求
解决方案:从多工作表Excel自动生成区间转换Python函数
实现思路
- 读取Excel文件的所有工作表,每个工作表对应一个类别
- 针对每个工作表,提取区间规则(左边界、右边界、目标字段名)
- 根据规则动态生成对应的Python转换函数代码
- 可选择将生成的函数保存到文件或直接在运行环境中生效
前置依赖
先安装所需库:
pip install pandas openpyxl
核心代码实现
import pandas as pd def generate_conversion_functions(excel_path, output_file=None): # 读取所有工作表,返回字典:{工作表名: DataFrame} sheets = pd.read_excel(excel_path, sheet_name=None, engine='openpyxl') generated_code = [] generated_code.append("import pandas as pd\n\n") for sheet_name, df in sheets.items(): # 提取目标字段名(keyval列中非空的值) keyval = df['keyval'].dropna().iloc[0] # 过滤有效区间行并转换为整数类型 valid_rows = df.dropna(subset=['left', 'right']).astype({'left': int, 'right': int}) # 生成函数名(处理特殊字符) func_name = f"convert_{sheet_name.lower().replace(' ', '_')}" func_code = [f"def {func_name}(row: pd.Series) -> str:"] # 处理第一个区间 first_row = valid_rows.iloc[0] func_code.append(f" if row[\"{keyval}\"] <= {first_row['right']}:") func_code.append(f" return \"{first_row['left']}-{first_row['right']}\"") # 处理中间区间 for i in range(1, len(valid_rows)-1): current_row = valid_rows.iloc[i] prev_right = valid_rows.iloc[i-1]['right'] func_code.append(f" elif {prev_right} < row[\"{keyval}\"] <= {current_row['right']}:") func_code.append(f" return \"{current_row['left']+1}-{current_row['right']}\"") # 处理最后一个区间 if len(valid_rows) > 1: last_row = valid_rows.iloc[-1] prev_right = valid_rows.iloc[-2]['right'] func_code.append(f" elif {prev_right} < row[\"{keyval}\"] <= {last_row['right']}:") func_code.append(f" return \"{last_row['left']+1} plus\"") # 添加默认返回分支 func_code.append(" else:") func_code.append(" return \"unknown\"") func_code.append("\n") generated_code.extend(func_code) full_code = '\n'.join(generated_code) # 保存到文件或直接执行 if output_file: with open(output_file, 'w', encoding='utf-8') as f: f.write(full_code) print(f"函数已生成并保存到 {output_file}") else: exec(full_code) print(f"已在当前环境中生成 {len(sheets)} 个转换函数") return full_code # 示例调用 if __name__ == "__main__": # 替换为你的Excel文件路径 generate_conversion_functions("categories.xlsx", output_file="conversion_functions.py")
代码说明
- 工作表读取:通过
sheet_name=None一次性读取所有工作表,以字典形式存储,键为工作表名,值为对应数据框 - 规则提取:从
keyval列获取目标字段名(如示例中的kg),并确保区间边界为整数类型 - 函数生成逻辑:
- 第一个区间直接判断值≤右边界,返回
left-right格式字符串 - 中间区间判断值处于上一个右边界与当前右边界之间,返回
left+1-right格式(对应示例的4-8) - 最后一个区间返回
left+1 plus格式(对应示例的16 plus)
- 第一个区间直接判断值≤右边界,返回
- 输出方式:支持将生成的函数保存为.py文件,或直接在当前Python环境中执行生效
示例输出
针对你提供的示例工作表,生成的函数代码如下:
import pandas as pd def convert_xxx(row: pd.Series) -> str: if row["kg"] <= 3: return "0-3" elif 3 < row["kg"] <= 8: return "4-8" elif 8 < row["kg"] <= 15: return "9-15" elif 15 < row["kg"] <= 50: return "16 plus" else: return "unknown"
内容的提问来源于stack exchange,提问作者314mip
相关产品推荐
相关产品推荐

