按FITS文件中多列中的值聚合表行

The*_*tor 1 python fits pyfits

我有一个包含许多列的FITS文件.该文件的简化示例的一部分如下所示:

    A      B      C
   100     1      90
   100     2      90
   100     3      90
   100     4      90
   211     40     70
   211     41     70
   211     42     70
   211     43     70
   211     44     70
Run Code Online (Sandbox Code Playgroud)

如果您注意到这里,A和C列的前四行是相同的,但B列的变化范围是1到4.然后A和C列的下5个值相同,但B列的变化范围是40到44.

我想做的是,写一个程序,创建一个这样的文件:

   A      B     C
  100     4     90
  211     5     70
Run Code Online (Sandbox Code Playgroud)

也就是说,B列应包含A列和C列相同的值的数量!

我想知道在Python中如何做到这一点.它不一定需要处理FITS文件,如果有一些例程无法在FITS文件中使用,我也可以将其转换为ASCII格式.

到目前为止我尝试了什么:

我遇到了一个被调用的例程Collections,它有一个子例程,它调用Counter列表中相等的值并返回它们.

我试过了:

import collections
counter = collections.Counter(a)
counts = counter.values()
Run Code Online (Sandbox Code Playgroud)

但这只能给我A列中相同的值.有人能告诉我如何使用这个例程将这些值与C列进行比较吗?

Jon*_*nts 5

我会选择这样的东西......:

from itertools import groupby
from operator import itemgetter

with open('input') as fin, open('output', 'w') as fout:
    fout.write(next(fin, ''))
    rows = (line.split() for line in fin)
    for k, g in groupby(rows, itemgetter(0, 2)):
        fout.write('{} {} {}\n'.format(k[0], sum(1 for _ in g), k[1]))
Run Code Online (Sandbox Code Playgroud)
  • 直接写出标题......
  • 构建生成器以生成按空格分割的行
  • 使用itertools.groupby于GROUPBY第一和第三列
  • 计算出现次数g以获取组的长度
  • 写出按需要格式化的行......

您也可以使用collections.Counter如果组是非连续的并且应该计为一个,您可以groupby使用以下内容替换:

counts = Counter((row[0], row[2]) for row in rows)
for k, v in counts.iteritems():
    fout.write('{} {} {}\n'.format(k[0], v, k[1]) # or even...
            # print >> fout, k[0], v, k[1] 
Run Code Online (Sandbox Code Playgroud)