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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 16:48:04