使用Python为Excel设置条件格式时字符串与整数比较报错如何解决
报错原因
你的代码触发类型错误的核心原因有两个:
- 原始数据过滤不彻底:开头的
Run1文件头行、空行没有被过滤,这些行全是字符串内容,你给DataFrame全局指定dtype=int根本不会生效,所有列最终还是字符串类型的object格式 - 即使过滤了无效行,每一行的第一个元素是
AD Averaged xxx(mV)这类描述字符串,本身无法转为整数,全局指定int类型同样会失效,最终你要比较的Vout列的值全是"0001"这类字符串格式的数字,无法直接和整数2做比较
解决方案
按照以下步骤修改代码即可,核心逻辑是先过滤无效数据,再单独给数值列做类型转换:
import pandas as pd import numpy as np from openpyxl import load_workbook # 读取txt文件 with open("Data at 20-5C on(18-11-21)(decoupled).txt", "r", encoding="utf8") as f: data = f.readlines() # 只保留AD Averaged的行,自动过滤RAW行、空行、开头的文件头行 data = ([x.strip().split(',') for x in data if "AD Averaged" in x]) max_len = max([len(i) for i in data]) for row in data: if len(row) < max_len: row += [''] * (max_len - len(row)) # 先不指定全局dtype,正常构造DataFrame df = pd.DataFrame(data, columns=['', 'TH+', 'Vacm', 'Vout', 'Bat mon', 'TH-', 'Vbat2', 'Vamb', 'VambCorrY']) # 单独给数值列做类型转换,异常值转为NaN num_cols = ['TH+', 'Vacm', 'Vout', 'Bat mon', 'TH-', 'Vbat2', 'Vamb', 'VambCorrY'] df[num_cols] = df[num_cols].apply(pd.to_numeric, errors='coerce') # 插入索引列 df.insert(1,'Index', df.index) stage_threshold = 2 # 着色逻辑加NaN判断,避免空值报错 df_styled = df.style.applymap( lambda x: 'background-color: red' if pd.notna(x) and x < stage_threshold else 'background-color: green', subset=['Vout'] ) df_styled.to_excel('Data at 20-5C on(18-11-21)(decoupled).xlsx', engine='openpyxl', index=False)
如果不想提前做类型转换,也可以直接在着色的lambda里临时转类型,修改判断逻辑为int(x) < stage_threshold即可,但提前统一数据类型能避免后续其他操作出现同类问题,更推荐上面的方案。
内容的提问来源于stack exchange,提问作者fudgey
相关产品推荐
相关产品推荐

