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

水井镭污染数据筛选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

现有代码的核心问题

  1. 冗余重复逻辑:两个函数重复执行计数、最大值统计,效率低且易出现逻辑不一致
  2. 浓度值类型错误:带单位的浓度值(如33.7 PCI/L)无法直接参与数值比较,导致最大值计算失效
  3. 去重方式错误:list(set(...))会破坏数据结构,若存在同浓度最大值的多条数据,会丢失有效信息
  4. 返回结果冗余:返回的元组额外携带最大值字段,不符合需求的输出格式
  5. 日期处理低效且异常覆盖不全:多次重复解析日期年份,仅捕获AttributeError,未处理日期格式错误的情况
  6. 海量数据适配差:循环遍历的方式处理大规模数据集时,性能瓶颈明显

修复后的代码实现

采用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 00:45:32