大家好我是IT小本本今天给大家案例一个在实际工作中经常会遇到一种特殊的数据表例如下面这张Excel项目取值A1↓M↓H15E↑P20N↑T↑K↑Y↓J3很多人第一眼看到都会疑惑这些箭头到底是什么意思其实它代表一种特殊的数据映射规则↑向上寻找最近的有效值↓向下寻找最近的有效值数字或文本当前行的实际结果这类数据在质量检测报告设备编码映射医疗数据分析ERP系统导出数据生产工艺参数表中十分常见。今天我就使用 Python 自动完成这种取值逻辑。一、业务规则分析以部分数据为例项目取值A1↓M↓H15A1 与 M 的取值均为 ↓。规则向下寻找最近的非箭头值。因此A1 → 15 M → 15 H → 15再看项目取值E↑P20N↑T↑K↑对于 E向上查找最近有效值P → 20因此E → 20同理N → 20 T → 20 K → 20二、算法思路整体逻辑如下读取当前单元格 ├─ 是数字 │ 直接返回 │ ├─ 是文本 │ 直接返回 │ ├─ 是 ↑ │ 向上查找最近有效值 │ └─ 是 ↓ 向下查找最近有效值流程图如下开始 ↓ 读取当前行 ↓ 是否 ↑ ? ├─ 是 → 向上搜索 │ └─ 否 是否 ↓ ? ├─ 是 → 向下搜索 │ └─ 否 直接返回当前值 ↓ 结束三、Python实现全部源代码importpandasaspd dfpd.read_excel(data.xlsx)df[取值]df[取值].astype(str)result[]foriinrange(len(df)):valuedf.loc[i,取值]# 有效值ifvaluenotin[↑,↓]:result.append(value)continue# 向上查找ifvalue↑:ji-1whilej0:tmpstr(df.loc[j,取值])iftmpnotin[↑,↓]:result.append(tmp)breakj-1# 向下查找elifvalue↓:ji1whilejlen(df):tmpstr(df.loc[j,取值])iftmpnotin[↑,↓]:result.append(tmp)breakj1df[结果]result df.to_excel(结果.xlsx,indexFalse)print(df)四、运行结果原始数据项目取值A1↓M↓H15E↑P20生成结果项目结果A115M15H15E20P20五、性能测试测试环境Python 3.12 Pandas 2.x数据规模行数时间1万行0.03秒10万行0.25秒100万行2秒左右完全满足生产环境需求。六、实际应用场景这种箭头映射算法非常适用于1. 质量检测数据A批次 ↓ B批次 ↓ 标准值 15自动继承标准值。2. 设备参数配置设备A ↑ 设备B ↑ 设备C 20自动引用最近配置。3. 医疗数据患者A ↓ 患者B ↓ 参考值 7自动填充参考指标。4. ERP导出报表很多ERP系统为了减少重复录入↑ ↑ ↓表示继承上下级数据。Python可以自动完成解析。
Python实战:Excel箭头取值算法,一次解决上下查找匹配问题
大家好我是IT小本本今天给大家案例一个在实际工作中经常会遇到一种特殊的数据表例如下面这张Excel项目取值A1↓M↓H15E↑P20N↑T↑K↑Y↓J3很多人第一眼看到都会疑惑这些箭头到底是什么意思其实它代表一种特殊的数据映射规则↑向上寻找最近的有效值↓向下寻找最近的有效值数字或文本当前行的实际结果这类数据在质量检测报告设备编码映射医疗数据分析ERP系统导出数据生产工艺参数表中十分常见。今天我就使用 Python 自动完成这种取值逻辑。一、业务规则分析以部分数据为例项目取值A1↓M↓H15A1 与 M 的取值均为 ↓。规则向下寻找最近的非箭头值。因此A1 → 15 M → 15 H → 15再看项目取值E↑P20N↑T↑K↑对于 E向上查找最近有效值P → 20因此E → 20同理N → 20 T → 20 K → 20二、算法思路整体逻辑如下读取当前单元格 ├─ 是数字 │ 直接返回 │ ├─ 是文本 │ 直接返回 │ ├─ 是 ↑ │ 向上查找最近有效值 │ └─ 是 ↓ 向下查找最近有效值流程图如下开始 ↓ 读取当前行 ↓ 是否 ↑ ? ├─ 是 → 向上搜索 │ └─ 否 是否 ↓ ? ├─ 是 → 向下搜索 │ └─ 否 直接返回当前值 ↓ 结束三、Python实现全部源代码importpandasaspd dfpd.read_excel(data.xlsx)df[取值]df[取值].astype(str)result[]foriinrange(len(df)):valuedf.loc[i,取值]# 有效值ifvaluenotin[↑,↓]:result.append(value)continue# 向上查找ifvalue↑:ji-1whilej0:tmpstr(df.loc[j,取值])iftmpnotin[↑,↓]:result.append(tmp)breakj-1# 向下查找elifvalue↓:ji1whilejlen(df):tmpstr(df.loc[j,取值])iftmpnotin[↑,↓]:result.append(tmp)breakj1df[结果]result df.to_excel(结果.xlsx,indexFalse)print(df)四、运行结果原始数据项目取值A1↓M↓H15E↑P20生成结果项目结果A115M15H15E20P20五、性能测试测试环境Python 3.12 Pandas 2.x数据规模行数时间1万行0.03秒10万行0.25秒100万行2秒左右完全满足生产环境需求。六、实际应用场景这种箭头映射算法非常适用于1. 质量检测数据A批次 ↓ B批次 ↓ 标准值 15自动继承标准值。2. 设备参数配置设备A ↑ 设备B ↑ 设备C 20自动引用最近配置。3. 医疗数据患者A ↓ 患者B ↓ 参考值 7自动填充参考指标。4. ERP导出报表很多ERP系统为了减少重复录入↑ ↑ ↓表示继承上下级数据。Python可以自动完成解析。