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

标签 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

如果您在这里注意到,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] 

关于python - 按 FITS 文件中多列中的值聚合表行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24475661/

相关文章:

python - 将 ASCII 表转换为 FITS 图像

python - botocore.exceptions.ClientError调用GetObject操作时发生错误(SignatureDoesNotMatch)

python - 检索已展平为二维的三角形上某个点的实际 3D 坐标

python - 有条件地修改多个变量

python - 从pyfits数据表中获取随机子样本

python - 卡固定满足 FITS 标准是什么意思?

python - 使用 2 个 FITS 文件将像素转换为波长

Python,PyFITS,无法打开文件

python - 如何在 Python 中对单个函数执行多处理?

python - 使用 PyFITS 向 FITS 表添加列