水井镭污染数据筛选Python脚本Bug排查请求
水井镭污染数据处理脚本Bug排查与修复
需求说明
- 处理包含多水井的海量数据集,每条数据包含唯一Well ID、镭污染水平(Radium Level)、采样日期(Sample Date)
- 处理规则:
- 单水井单年份仅采样1次:保留该条数据
- 单水井单年份采样多次:保留污染水平最高的样本
- 最终生成符合要求的新Excel表
输入示例
Well ID: AT091 Radium Level: 44.9 Sample Date: 3/18/2015 Well ID: AT091 Radium Level: 50.2 Sample Date: 2/18/2015 Well ID: AT091 Radium Level: 33.7 PCI/L Sample Date: 7/28/2020
预期输出示例
Well ID: AT091 Radium Level: 50.2 Sample Date: 2/18/2015 Well ID: AT091 Radium Level: 33.7 PCI/L Sample Date: 7/28/2020
现有代码的核心问题
- 冗余重复逻辑:两个函数重复执行计数、最大值统计,效率低且易出现逻辑不一致
- 浓度值类型错误:带单位的浓度值(如
33.7 PCI/L)无法直接参与数值比较,导致最大值计算失效 - 去重方式错误:
list(set(...))会破坏数据结构,若存在同浓度最大值的多条数据,会丢失有效信息 - 返回结果冗余:返回的元组额外携带最大值字段,不符合需求的输出格式
- 日期处理低效且异常覆盖不全:多次重复解析日期年份,仅捕获
AttributeError,未处理日期格式错误的情况 - 海量数据适配差:循环遍历的方式处理大规模数据集时,性能瓶颈明显
修复后的代码实现
采用Pandas分组处理,适配海量数据且逻辑简洁,解决所有上述问题:
import pandas as pd def process_well_data(input_excel_path, output_excel_path): # 读取原始Excel数据(假设列名为'Well ID', 'Radium Level', 'Sample Date') df = pd.read_excel(input_excel_path) # 解析镭浓度:提取数值部分,兼容带单位的输入 def extract_concentration(conc_str): if pd.isna(conc_str): return None # 提取字符串中的数字与小数点,剥离单位 num_part = ''.join([c for c in str(conc_str) if c.isdigit() or c == '.']) try: return float(num_part) except ValueError: return None # 生成数值型浓度列,过滤无效数据 df['Concentration Value'] = df['Radium Level'].apply(extract_concentration) df = df.dropna(subset=['Concentration Value', 'Sample Date']) # 提取采样年份 df['Sample Year'] = pd.to_datetime(df['Sample Date']).dt.year # 排序:按水井ID、年份升序,浓度降序,日期升序(确保同浓度时保留最早样本) df_sorted = df.sort_values( ['Well ID', 'Sample Year', 'Concentration Value', 'Sample Date'], ascending=[True, True, False, True] ) # 分组取每组第一行(即该水井该年份的最优样本) result_df = df_sorted.groupby(['Well ID', 'Sample Year'], as_index=False).first() # 保留需求列,清理临时字段 result_df = result_df[['Well ID', 'Radium Level', 'Sample Date']] # 输出到新Excel result_df.to_excel(output_excel_path, index=False) return result_df
修复说明
- 高效适配海量数据:用Pandas分组替代循环遍历,性能提升显著
- 兼容带单位的浓度值:解析提取数值部分,解决非数值类型无法比较的问题
- 异常数据过滤:自动剔除无效的浓度、日期数据,避免计算错误
- 明确最优样本规则:通过排序确保同组内仅保留浓度最高的样本,若浓度相同则保留最早采样数据(可按需调整为最晚)
- 无冗余逻辑:单函数完成全流程处理,避免重复统计
- 输出格式合规:直接保留原始浓度的显示格式(含单位),符合需求
内容的提问来源于stack exchange,提问作者wellman
相关产品推荐
相关产品推荐

