You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 10:17:43