我有一个包含星星数据的 astropy.table.table 对象。每颗星一行,列包含星名、最大星等等数据。
我了解 astropy 表的内部表示是每一列的 dict,行作为 dict 对象的切片即时返回。
我需要将 astropy 表转换为 dict 对象的 Python 列表,每颗星一个 dict。本质上,这既是表格的转置,又是转换。
我显然可以按行内的列遍历表,以构建字典并将它们添加到列表中,但我希望有一种更有效的方法?
我有一个包含星星数据的 astropy.table.table 对象。每颗星一行,列包含星名、最大星等等数据。
我了解 astropy 表的内部表示是每一列的 dict,行作为 dict 对象的切片即时返回。
我需要将 astropy 表转换为 dict 对象的 Python 列表,每颗星一个 dict。本质上,这既是表格的转置,又是转换。
我显然可以按行内的列遍历表,以构建字典并将它们添加到列表中,但我希望有一种更有效的方法?
这是一个想法。我不确定您是否可以提高效率,除非表很大,最好先转换为纯 Numpy 数组.as_array():
In [1]: from astropy.table.table_helpers import simple_table
In [2]: t = simple_table()
In [3]: t
Out[3]:
<Table length=3>
a b c
int64 float64 str1
----- ------- ----
1 1.0 c
2 2.0 d
3 3.0 e
In [4]: names = t.colnames
In [5]: [dict(zip(names, row)) for row in t]
Out[5]:
[{'a': 1, 'b': 1.0, 'c': 'c'},
{'a': 2, 'b': 2.0, 'c': 'd'},
{'a': 3, 'b': 3.0, 'c': 'e'}]
我最终迭代、切片和复制为列表,这在相对较小的数据集上运行良好。
如果您正在寻找一种更紧凑和令人难忘的方式,您可以将表格转换为 pandas.DataFrame 并使用to_dictpandas DataFrame 的方法。将表复制到新对象中可能不是最有效的,但根据您要转换的格式,pandas 会更方便。Astropy 表有一个方便to_pandas和from_pandas方法。
>>> from astropy.table.table_helpers import simple_table
>>> simple_table().to_pandas().to_dict(orient='records')
[{'a': 1, 'b': 1.0, 'c': 'c'},
{'a': 2, 'b': 2.0, 'c': 'd'},
{'a': 3, 'b': 3.0, 'c': 'e'}]