Pandas合并同索引行:列全0取0、存在1则取1的实现方法
解决方案
方案1:基于pandas实现
你需要的逻辑本质是同索引分组后取每列的最大值,0和1的场景下,只要存在1结果就为1,全0才返回0,正好和max聚合运算的逻辑完全匹配。之前用groupby没得到正确结果大概率是没有指定正确的聚合函数,实现代码如下:
import pandas as pd # 读取TSV文件,指定第一列为索引 df = pd.read_csv("你的文件路径.tsv", sep="\t", index_col=0) # 按索引层级分组,每列取最大值 result_df = df.groupby(level=0).max() # 可直接保存为新的TSV文件 result_df.to_csv("输出结果路径.tsv", sep="\t")
方案2:不依赖pandas的纯Python实现
直接基于Python标准库读取TSV逐行处理,用字典存储每个索引对应的各列最大值即可,无需安装第三方依赖:
res_dict = {} header = [] # 读取原始TSV文件 with open("你的文件路径.tsv", "r", encoding="utf-8") as f: # 读取表头 header = f.readline().strip().split("\t") col_num = len(header) - 1 # 逐行处理数据 for line in f: line = line.strip() if not line: continue parts = line.split("\t") idx = parts[0] val_list = list(map(int, parts[1:])) if idx not in res_dict: res_dict[idx] = [0]*col_num # 每列更新为最大值 for i in range(col_num): if val_list[i] > res_dict[idx][i]: res_dict[idx][i] = val_list[i] # 写入结果TSV with open("输出结果路径.tsv", "w", encoding="utf-8") as f: f.write("\t".join(header) + "\n") for idx, vals in res_dict.items(): write_line = [idx] + list(map(str, vals)) f.write("\t".join(write_line) + "\n")
内容的提问来源于stack exchange,提问作者user12280110
相关产品推荐
相关产品推荐

