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
相关产品推荐
相关产品推荐

