Как преобразовать обработанные данные из файла .fits в pandas DataFrame - PullRequest
1 голос
/ 29 сентября 2019

У меня есть файл .fits с некоторыми данными, из которого я сделал некоторые манипуляции и хотел бы сохранить новые данные (не весь файл .fits) в виде pd.DataFrame. Данные поступают из файла с именем pabdatazcut.fits.

#Sorted by descending Paschen Beta flux
sortedpab = sorted(pabdatazcut[1].data , key = lambda data: data['PAB_FLUX'] , reverse = True )

unsorteddf = pd.DataFrame(pabdatazcut[1].data)

sortedpabdf = pd.DataFrame({'FIELD' : sortedpab['FIELD'],
                        'ID' :  sortedpab['ID'],
                        'Z_50' : sortedpab['Z_50'],
                        'Z_ERR' : ((sortedpab['Z_84'] - sortedpab['Z_50']) + (sortedpab['Z_50'] - sortedpab['Z_16'])) / (2 * sortedpab['Z_50']),
                        '$\lambda Pa\beta$' : 12820 * (1 + sortedpab['Z_50']),
                        '$Pa\beta$ FLUX' : sortedpab['PAB_FLUX'],
                        '$Pa\beta$ FLUX ERR' : sortedpab['PAB_FLUX_ERR']})

'' ''

Я получил сообщение 'TypeError: списочные индексы должны быть целыми числами или слайсами, а не str' сообщение об ошибкекогда я пытаюсь запустить это.

1 Ответ

1 голос
/ 29 сентября 2019

Вы получаете это из-за доступа типа sortedpab['ID'] Я думаю. Согласно документу sorted возвращает отсортированный список. Списки не принимают строки как id для доступа к элементам. Доступ к ним возможен только с помощью целочисленных позиций или срезов. Это то, что ошибка пытается сказать вам.

К сожалению, я не могу проверить это на моей машине, потому что у меня нет ваших данных, но я думаю, что вы действительно хотите сделать что-то вроде этого:

data_dict= dict()
for obj in sortedpab:
    for key in ['FIELD', 'ID', 'Z_50', 'Z_50', 'Z_ERR', 'Z_84', 'PAB_FLUX', 'PAB_FLUX_ERR']:
        data_dict.setdefault(key, list()).append(obj[key])

sortedpabdf = pd.DataFrame(data_dict)
# maybe you don't even need to create the data_dict but
# can pass the sortedpad directly to your data frame
# have you tried that already?
#
# then I would calculate the columns which are not just copied
# in the dataframe directly, as this is more convenient
# like this:
sortedpabdf['Z_ERR']= ((sortedpabdf['Z_84'] - sortedpabdf['Z_50']) + (sortedpabdf['Z_50'] - sortedpabdf['Z_16'])) / (2 * sortedpabdf['Z_50'])
sortedpabdf['$\lambda Pa\beta$']= 12820 * (1 + sortedpabdf['Z_50']),

sortedpabdf.rename({
        'PAB_FLUX': '$Pa\beta$ FLUX', 
        'PAB_FLUX_ERR': '$Pa\beta$ FLUX ERR'
    }, axis='columns', inplace=True)

cols_to_delete= [col for col in sortedpabdf.columns if col not in ['FIELD', 'ID', 'Z_50', 'Z_ERR', '$\lambda Pa\beta$', '$Pa\beta$ FLUX','$Pa\beta$ FLUX ERR'])
sortedpabdf.drop(cols_to_delete, axis='columns', inplace=True)
...