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

使用Python在单个列条目上组合两个FITS表,python,join,datatables,fits,Python,Join,Datatables,Fits,我分两部分阅读。将表格放在“列表a”和“列表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_

我分两部分阅读。将表格放在“列表a”和“列表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() 

但它是如此缓慢和笨重,我相信一定会有一个更好的,更具python风格的方法

将列表转换为数据帧,然后进行
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")

事实证明,将列表转换为数据帧,然后进行
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”都是表,并且您希望从“List_b”中获取条目的“年龄”,在“List_a”和“List_b”中,您可以像在您的方法中一样使用熊猫。但是Astropy也有一个内置的表格

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

>>> from astropy.table import Table
>>> tab_a = Table({'NAME': ['A', 'B', 'C']})
>>> tab_b = Table({'NAME': ['A', 'C', 'D'], 'AGE': [1, 3, 4]})
如果您正在读取FITS文件,您可以使用,例如,将FITS表读入
对象(以及其他方法)

然后,您可以使用
join
连接两个名称相同的表:

>>> 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
(在这里,您可以用文件名替换sys.stdout;我只是出于演示目的使用它)。正如你所看到的,有很多,尽管你也可以定义你自己的

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

假设“列表a”和“列表b”都是表,并且您希望从“列表b”中获得“年龄”对于同时包含“列表a”和“列表b”的条目,您可以在方法中使用熊猫。但是Astropy也有一个内置的表格

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

>>> from astropy.table import Table
>>> tab_a = Table({'NAME': ['A', 'B', 'C']})
>>> tab_b = Table({'NAME': ['A', 'C', 'D'], 'AGE': [1, 3, 4]})
如果您正在读取FITS文件,您可以使用,例如,将FITS表读入
对象(以及其他方法)

然后,您可以使用
join
连接两个名称相同的表:

>>> 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
(在这里,您可以用文件名替换sys.stdout;我只是出于演示目的使用它)。正如你所看到的,有很多,尽管你也可以定义你自己的


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

查看
pandas
,因为它看起来像是要做一个传统的join什么是
list\u a
列表B
。你没有具体说明。我不确定FITS在这里的位置,除非这些是FITS表中的列,但是如果您在那时使用Astropy表界面,那么表从哪里来并不重要。请查看
pandas
,因为看起来您正在寻找一种传统的连接方式
list\u a
list\u B
。你没有具体说明。我不确定FITS在这里的位置,除非这些是FITS表中的列,但是如果您在那时使用Astropy表界面,那么表从哪里来并不重要。这里您只使用
list\u a
(在您的问题中,您编写了
list\u a
)而且您根本没有使用
list_B
,因此不清楚这是如何解决您所说的问题的(特别是你不能从一个
列表中实例化一个Astropy
表,所以实际上什么是
列表a
?如果不知道
列表a
是什么,很难知道你在这里做什么。这里也有很多不必要的复制。有了Astropy的
表,你知道你可以调用吗e> .to_pandas()
将其转换为pandas
数据帧
?(注意:我同意使用pandas连接两个表的一般方法,但我想指出,这对未来的读者来说不是一个明确的答案)这里您只使用了
列表a
(在您的问题中,您写了
列表a
)而且您根本没有使用
list_B
,因此不清楚这是如何解决您所说的问题的(特别是你不能从一个
列表中实例化一个Astropy
表,所以实际上什么是
列表a
?如果不知道
列表a
是什么,很难知道你在这里做什么。这里也有很多不必要的复制。有了Astropy的
表,你知道你可以调用吗e> .to_pandas()
将其转换为pandas
数据帧
?(注意:我同意使用pandas连接两个表的一般方法,但我想指出,对于未来的读者来说,这不是一个明确的答案)