【问题标题】:Python: sum column if matchesPython:如果匹配,求和列
【发布时间】:2018-05-15 08:39:16
【问题描述】:

我有一个包含数千行的巨大文件,如下所示:

`C509.TCGA-78-7159-10A-01D-2036-08.1-C509.  1   0   0   1   0   0
 C509.TCGA-78-7159-10A-01D-2036-08.1-C509.  0   1   1   0   1   1`

如果行的第一列匹配,我想将一行的第二列与第二行的第二列相加,第三列与第三列相加,以此类推,不使用熊猫。可能使用 python 会更好,而不是 awk,因为它的大小。

输出应该是:

C509.TCGA-78-7159-10A-01D-2036-08.1-C509. 1 1 1 1 1 1

谢谢你的帮助:)

【问题讨论】:

  • 这些数据是如何存储的?作为列表列表?
  • 除了文字解释外,请您给我们您想要的输出。
  • @JahKnows 数据存储在这样的文件中,分列。
  • @BcK 所需的输出将是此输入的示例:C509.TCGA-78-7159-10A-01D-2036-08.1-C509。 1 1 1 1 1 1
  • @Miss,这是什么文件?

标签: python sum multiple-columns


【解决方案1】:

您可以使用以下方法:

import re

res = dict()

with open("mydata.txt") as f:
  for line in f:
    id, col1, col2, col3, col4, col5, col6 = re.split(r"\s+", line)
    res.setdefault(id, [0] * 6)
    res[id][0] += int(col1)
    res[id][1] += int(col2)
    res[id][2] += int(col3)
    # ... and so on for the rest of cols

您输入的输出是:

print(res)
{'C509.TCGA-78-7159-10A-01D-2036-08.1-C509.': [1, 1, 1, 1, 1, 1]}

【讨论】:

    【解决方案2】:

    如果您将数据作为列表列表加载到 Python 中,您可以执行以下操作

    from operator import add
    
    data = [['C509.TCGA-78-7159-10A-01D-2036-08.1-C509.',  1,   0,   0,   1,   0,   0],
            ['C509.TCGA-78-7159-10A-01D-2036-08.1-C510.',  0,   1,   1,   0,   1,   1,],
            ['C509.TCGA-78-7159-10A-01D-2036-08.1-C509.',  1,   0,   0,   1,   1,   0],
            ['C509.TCGA-78-7159-10A-01D-2036-08.1-C509.',  1,   0,   0,   1,   0,   2],]
    
    dic = {}
    for i in data:
        if not i[0] in dic: dic.update({i[0]: i[1::]})
        else: dic[i[0]] = list(map(add, dic[i[0]], i[1::]))
    

    这为您提供了一个字典,其中包含每个唯一的第一个值和其他列的总和。

    {'C509.TCGA-78-7159-10A-01D-2036-08.1-C509.': [3, 0, 0, 3, 1, 2],
    'C509.TCGA-78-7159-10A-01D-2036-08.1-C510.': [0, 1, 1, 0, 1, 1]}

    【讨论】:

      猜你喜欢
      • 2015-07-20
      • 2022-11-27
      • 2019-01-20
      • 1970-01-01
      • 2022-09-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多