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

Python TSV统计脚本计数异常问题排查求助

解决TSV文件junction_aa与v_call组合计数总和异常问题

可能的异常原因

  • 脚本逻辑错误:循环嵌套、重复调用计数逻辑导致同一行被多次统计
  • 文件读取异常:TSV存在隐藏空行、混合换行符或字段内包含制表符,导致行拆分错误,读取了多余"行"
  • 空值/空白处理缺失:junction_aa或v_call为空值/空白字符时,未过滤导致无效分组或重复计数
  • 分组键生成错误:字段值含前后空白,导致同一实际组合被拆分为多个不同键

排查与修复步骤

1. 先验证原始文件有效行数

用命令行确认非空有效行数(排除空行):

grep -v "^$" your_file.tsv | wc -l

若结果不等于29081,说明文件存在无效行,需先过滤。

2. 修复计数脚本逻辑

以下是确保每行仅统计一次的基础脚本,同时加入空值过滤与行数校验:

import csv
from collections import defaultdict

def count_combo(input_path):
    combo_counts = defaultdict(int)
    with open(input_path, "r", newline="", encoding="utf-8") as f:
        reader = csv.DictReader(f, delimiter="\t")
        # 校验必要字段
        required_fields = {"junction_aa", "v_call"}
        if not required_fields.issubset(reader.fieldnames):
            raise ValueError("TSV缺少必要字段:junction_aa或v_call")
        
        processed_rows = 0
        for row in reader:
            processed_rows += 1
            # 去除字段前后空白,过滤空值行
            aa = row["junction_aa"].strip()
            v_call = row["v_call"].strip()
            if not aa or not v_call:
                continue
            combo = (aa, v_call)
            combo_counts[combo] += 1
        
        print(f"实际处理行数:{processed_rows}")
        print(f"计数总和:{sum(combo_counts.values())}")
    return combo_counts

# 调用示例
counts = count_combo("your_input.tsv")

3. 用Pandas做稳健处理(适合大型文件)

如果文件存在格式异常,Pandas的读取逻辑更健壮:

import pandas as pd

# 读取文件,保留字符串格式避免类型转换问题
df = pd.read_csv("your_input.tsv", sep="\t", dtype=str)
print(f"原始文件行数:{len(df)}")

# 过滤空值与空白行
df_clean = df.dropna(subset=["junction_aa", "v_call"])
df_clean = df_clean[(df_clean["junction_aa"].str.strip() != "") & (df_clean["v_call"].str.strip() != "")]
print(f"有效处理行数:{len(df_clean)}")

# 统计组合次数
combo_counts = df_clean.groupby(["junction_aa", "v_call"], as_index=False).size().rename(columns={"size": "count"})
print(f"计数总和:{combo_counts['count'].sum()}")

4. 验证分组一致性

  • 若v_call存在大小写差异(如IGHV1-2与ighv1-2),可统一转换为大写/小写:v_call = row["v_call"].strip().upper()
  • 打印前10组计数,手动核对是否与示例数据匹配,确认分组逻辑正确

内容的提问来源于stack exchange,提问作者munized by cg

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 11:37:17