Объединение двух таблиц FITS в одну запись столбца с использованием Python - PullRequest
1 голос
/ 08 октября 2019

Я читаю в двух таблицах .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() 

, но он настолько медленный и неуклюжий, что я уверен, что должен быть лучший, более питонический метод.

Ответы [ 2 ]

0 голосов
/ 09 октября 2019

Предположим, что "List_a" и "List_b" являются обеими таблицами, и вы хотите получить "возраст" из "List_b" для записей, где и "List_a", и "List_b", вы можете использовать Pandas, как в вашем подходе. Но у Astropy также есть встроенная join операция для таблиц.

Так что я предполагаю, что у вас есть что-то похожее на:

>>> 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 (среди других подходов).

Затем вы можете использовать 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

Я думаю, что, возможно, это то, что вы спрашиваете.

Затем вы можете записать это в формате ASCII (как в вашем примере) например:

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

(Здесь вы можете заменить sys.stdout именем файла; я просто использовал его в демонстрационных целях). Как вы можете видеть, существует множество встроенных выходных форматов для таблиц , хотя вы также можете определить и свой собственный.

В Astropy уже есть множество подобных полезностей, которые должны вас спасти вво многих случаях от изобретения колеса, когда дело доходит до манипулирования таблицами и обработки форматов файлов - просто просматривайте документы, чтобы лучше понять:)

0 голосов
/ 09 октября 2019

Оказывается, превращение списков в фреймы данных и последующее слияние 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")
...