1

我有一个包含星星数据的 astropy.table.table 对象。每颗星一行,列包含星名、最大星等等数据。

我了解 astropy 表的内部表示是每一列的 dict,行作为 dict 对象的切片即时返回。

我需要将 astropy 表转换为 dict 对象的 Python 列表,每颗星一个 dict。本质上,这既是表格的转置,又是转换。

我显然可以按行内的列遍历表,以构建字典并将它们添加到列表中,但我希望有一种更有效的方法?

4

3 回答 3

4

这是一个想法。我不确定您是否可以提高效率,除非表很大,最好先转换为纯 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'}]
于 2018-12-09T20:20:39.837 回答
0

我最终迭代、切片和复制为列表,这在相对较小的数据集上运行良好。

于 2019-06-20T21:09:44.900 回答
0

如果您正在寻找一种更紧凑和令人难忘的方式,您可以将表格转换为 pandas.DataFrame 并使用to_dictpandas DataFrame 的方法。将表复制到新对象中可能不是最有效的,但根据您要转换的格式,pandas 会更方便。Astropy 表有一个方便to_pandasfrom_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'}]
于 2018-12-16T14:59:28.367 回答