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