使用Pandas处理Excel含<的数据并设置单元格红色背景
处理Excel数据并设置样式导出
需求:
- 处理Excel表格中带“<”的数值:去除“<”后除以2(例如“<0.12”转为0.06)
- 给所有被处理过的单元格设置红色背景
- 导出为Excel表格(尽量不含id列)
修改后的代码实现
import pandas as pd import numpy as np # 定义列名 COLUMN_NAMES = ['reception_date', 'day', 'PM10', 'PM2,5', 'SO42--S', 'NO3-N', 'HNO3-N+NO3--N', 'NH3-N+NH4+-N'] # 需要处理的目标列 PROCESS_COLUMNS = ['PM10', 'SO42--S', 'NO3-N', 'HNO3-N+NO3--N'] # 读取Excel数据 df = pd.read_excel('data/PRODUCTS.xls', sheet_name='G', names=COLUMN_NAMES) # 过滤有效数据:剔除day为空的行,跳过第一行无效数据 df = df.dropna(subset=['day']).iloc[1:] # 创建布尔矩阵,记录哪些单元格是被处理过的 processed_mask = pd.DataFrame(False, index=df.index, columns=PROCESS_COLUMNS) # 批量处理目标列数据 for col in PROCESS_COLUMNS: def process_single_value(x): if isinstance(x, str) and '<' in x: # 标记该单元格为已处理 processed_mask.loc[x.name, col] = True # 清理格式并计算新值 clean_num = float(x.replace('<', '').replace(',', '.')) / 2 return clean_num try: # 处理普通数值(包含逗号分隔的格式) return float(x.replace(',', '.') if isinstance(x, str) else x) except: # 转换失败返回空值 return np.nan df[col] = df[col].apply(process_single_value) # 定义样式规则:给处理过的单元格设置红色背景 def highlight_processed_cells(row): styles = [] for col in PROCESS_COLUMNS: if processed_mask.loc[row.name, col]: styles.append('background-color: red') else: styles.append('') return styles # 应用样式到数据框 styled_data = df.style.apply(highlight_processed_cells, axis=1) # 导出Excel:设置index=False去除索引列(避免id类列出现) styled_data.to_excel('processed_result.xlsx', index=False)
关键说明
- 用**布尔矩阵
processed_mask**替代自定义类,更适配Pandas的样式渲染逻辑,方便标记处理过的单元格 - 统一处理数值格式:自动替换逗号为小数点,避免欧洲式数字格式导致的转换错误
- 通过
df.style实现单元格背景色设置,直接对接Excel导出功能 - 导出时通过
index=False剔除索引列,满足“尽量不含id列”的需求
内容的提问来源于stack exchange,提问作者docwho
相关产品推荐
相关产品推荐

