我正在使用天文数据,需要我对其进行总结。

我的数据包含约10,000行,每行代表一个系统。

输入文件由制表符分隔,如下所示:
exo sys_planet_count

0   1
0   0
3   4
0   1
2   5
0   0


请注意,外行星的数量通常为0或1,但并非始终如此。

每行代表一个系统,共有两列,一列用于在该系统中找到的系外行星,一列用于找到的行星总数。

我需要通过增加sys_planet_count来总结如下数据:

system_planet_count exo system_hits system_misses

5 3500 3000 1000
6 4500 4000 1500


exo行星的数量必须大于或等于system_hits,因为每个系统可能只有一个exo行星,或者取决于几个。

system_planet_count是表的组织方式。

对于与特定system_planet_count匹配的每一行(系统),它都会添加找到的外出数量。
如果找到外星人,则将+1添加到system_hits类别,因为该行找到了外星人行星,这是一个成功。
如果在该行中没有找到exos,则将其添加到system_misses类别中,因为行星上没有行。

请注意,system_misses和system_hits类别特定于该system_planet计数,即system_planet_count为5时为3000和1000,而system_planet_count为6时为4000和1500

问题在于,数据未按sys_planet_counts的升序进行排序。

为了总结数据,我想出了以下代码。我应该怎么做才能以10分钟或15分钟的时间快速汇总数据?

我正在考虑使用字典,因为每个system_planet_count都可以充当键

while open('data.txt','r') as input:
    for line in input:
        system_planet_count = 0
        exo_count = 0
        system_hits = 0
        system_misses = 0

        foo
    output.write(str(system_planet_count) + '\t' + str(exo_count) + '\t' + str(system_hits) + '\t' + str(system_misses) + '\')


输入示例:

exo sys_planet_count

 2 1
 0 1
 1 1
 0 5
 1 5
 0 5
 0 5
 2 5
 0 5
 0 4


输出:

system_planet_count exo system_hits system_misses

 1 3 2 1
 4 0 0 1
 5 3 2 4

最佳答案

这应该做您想要的摘要:

from collections import defaultdict

def summarize(file_name):
    exo, hit, miss = 0, 1, 2  # indexes of according counts
    d = defaultdict(lambda: [0, 0, 0])  # keep all counts for each type of system
    with open(file_name, 'r') as input:
        for line in input:
            exos, planets = map(int, line.strip().split())  # split, cast to int
            if exos:
                d[planets][exo] += exos
                d[planets][hit] += 1
            else:
                d[planets][miss] += 1

    for key in sorted(d.keys()):
        print('{} {} {} {}'.format(key, d[key][exo], d[key][hit], d[key][miss]))

summarize('data.txt')

10-07 13:11