Skip to main content
 首页 » 编程设计

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

2025年05月04日11jackei

我有一个包含很多列的 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 

如果您在这里注意到,A 和 C 列的前四行是相同的,但 B 列从 1 到 4 不等。然后接下来的 5 个值A 和 C 列相同,但 B 列从 40 到 44 不等。

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

   A      B     C 
  100     4     90 
  211     5     70 

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

我想知道如何在 Python 中执行此操作。不一定要处理一个FITS文件,如果有一些FITS文件不能用的例程我也可以转成ASCII格式。

到目前为止我已经尝试过:

我遇到了名为 Collections 的例程,它有一个名为 Counter 的子例程,它计算列表中相等值的数量并返回它们。

我试过:

import collections 
counter = collections.Counter(a) 
counts = counter.values() 

但这只给我 A 列中的那些值是相等的。谁能告诉我如何使用此例程将这些值也与 C 列进行比较?

请您参考如下方法:

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

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])) 
  • 直接写标题...
  • 构建生成器以生成由空格分隔的行
  • 使用itertools.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]