使用 Python 在单个列条目上组合两个 FITS 表

Combing two FITS tables on a single column entry using Python

我读入了两个 .FITS 表并将它们放入 "list_a" 和 "list_b" 中。 List_b 是 List_a 的一个子集,但有一些额外的,例如"age"',我想添加到我的输出中。这是我目前做事的方式:

file = open("MyFile.txt","w+") 

for ii in range(100000):
    name         = list_B[np.where((list_A['NAME'][ii] == list_B['NAME']))]['NAME']
    thing_from_b = list_B[np.where((list_A['NAME'][ii]  == list_B['NAME']))]['AGE']

    if (len(name) > 0) :
        file.write(" {} {} \n".format(list_A['NAME'][ii], age )

file.close() 

但是它又慢又笨重,我相信一定有更好、更像 pythonic 的方法。

原来将列表转换为数据帧,然后进行 pandas 合并,效果很好::

from   pandas import DataFrame
from astropy.table import Table

list_a_table = Table(list_a)
list_a_df    = DataFrame(np.array(list_a_table))
list_b_table = Table(list_b)
list_b_df    = DataFrame(np.array(list_b_table))

df_merge = pd.merge(list_a_df, list_b_df, on="name")

假设 "List_a" 和 "List_b" 都是 table,并且您想从 "List_b" 中获取 "ages" 两个 "List_a" 和 "List_b",您可以在您的方法中使用 Pandas。但是 Astropy 也有一个内置的 join operation for tables.

所以我猜你有类似的东西:

>>> from astropy.table import Table
>>> tab_a = Table({'NAME': ['A', 'B', 'C']})
>>> tab_b = Table({'NAME': ['A', 'C', 'D'], 'AGE': [1, 3, 4]})

如果您正在读取 FITS 文件,您可以使用,例如 Table.read 将 FITS table 读入 Table 对象(以及其他方法)。

然后你可以用join连接两个名字相同的table:

>>> from astropy.table import join
>>> tab_c = join(tab_a, tab_b, keys='NAME')
>>> tab_c
<Table length=2>
NAME  AGE
str1 int64
---- -----
   A     1
   C     3

我想这可能就是你要问的。

然后您可以将其写成 ASCII 格式(类似于您的示例),例如:

>>> import sys
>>> tab_c.write(sys.stdout, format='ascii.no_header')
A 1
C 3

(这里你可以用文件名替换sys.stdout;我只是用它来演示)。如您所见,有很多 built-in output formats for Tables,但您也可以定义自己的

Astropy 中已经有很多这样的好东西,在很多情况下,当涉及到 table 操作和文件格式处理时,它们应该可以让您免于重新发明轮子——只需仔细阅读文档以获得更好的感觉:)