astropy.table provides functionality for storing and manipulating heterogeneous tables of data in a way that is familiar to numpy users. A few notable features of this package are:
Currently astropy.table is used when reading an ASCII table using astropy.io.ascii. Future releases of AstroPy are expected to use the Table class for other subpackages such as astropy.io.votable and astropy.io.fits .
The basic workflow for creating a table, accessing table elements, and modifying the table is shown below. These examples show a very simple case, while the full astropy.table documentation is available from the Using table section.
First create a simple table with three columns of data named a, b, and c. These columns have integer, float, and string values respectively:
>>> from astropy.table import Table
>>> a = [1, 4, 5]
>>> b = [2.0, 5.0, 8.2]
>>> c = ['x', 'y', 'z']
>>> t = Table([a, b, c], names=('a', 'b', 'c'), meta={'name': 'first table'})
If you have row-oriented input data such as a list of records, use the rows keyword:
>>> data_rows = [(1, 2.0, 'x'),
...              (4, 5.0, 'y'),
...              (5, 8.2, 'z')]
>>> t = Table(rows=data_rows, names=('a', 'b', 'c'), meta={'name': 'first table'})
There are a few ways to examine the table. You can get detailed information about the table values and column definitions as follows:
>>> t
<Table rows=3 names=('a','b','c')>
array([(1, 2.0, 'x'), (4, 5.0, 'y'), (5, 8..., 'z')],
      dtype=[('a', '<i8'), ('b', '<f8'), ('c', 'S1')])
One can also assign an unit to the columns. If any column has an unit assigned, all units would be shown as follows:
>>> t['b'].unit = 's'
>>> t
<Table rows=3 names=('a','b','c') units=(None,'s',None)>
array([(1, 2.0, 'x'), (4, 5.0, 'y'), (5, 8..., 'z')],
      dtype=[('a', '<i8'), ('b', '<f8'), ('c', 'S1')])
From within the IPython notebook, the table is displayed as a formatted HTML table:
 
If you print the table (either from the notebook or in a text console session) then a formatted version appears:
>>> print(t)
 a   b   c
     s
--- --- ---
  1 2.0   x
  4 5.0   y
  5 8.2   z
For a long table you can scroll up and down through the table one page at time:
>>> t.more()  
You can also display it as an HTML-formatted table in the browser:
>>> t.show_in_browser()  
or as an interactive (searchable & sortable) javascript table:
>>> t.show_in_browser(jsviewer=True)  
Now examine some high-level information about the table:
>>> t.colnames
['a', 'b', 'c']
>>> len(t)
3
>>> t.meta
{'name': 'first table'}
Access the data by column or row using familiar numpy structured array syntax:
>>> t['a']       # Column 'a'
<Column name='a' unit=None format=None description=None>
array([1, 4, 5])
>>> t['a'][1]    # Row 1 of column 'a'
4
>>> t[1]         # Row obj for with row 1 values
<Row 1 of table
 values=(4, 5.0, 'y')
 dtype=[('a', '<i8'), ('b', '<f8'), ('c', 'S1')]>
>>> t[1]['a']    # Column 'a' of row 1
4
One can retrieve a subset of a table by rows (using a slice) or columns (using column names), where the subset is returned as a new table:
>>> print(t[0:2])      # Table object with rows 0 and 1
 a   b   c
     s
--- --- ---
  1 2.0   x
  4 5.0   y
>>> print(t['a', 'c'])  # Table with cols 'a', 'c'
 a   c
--- ---
  1   x
  4   y
  5   z
Modifying table values in place is flexible and works as one would expect:
>>> t['a'] = [-1, -2, -3]       # Set all column values
>>> t['a'][2] = 30              # Set row 2 of column 'a'
>>> t[1] = (8, 9.0, "W")        # Set all row values
>>> t[1]['b'] = -9              # Set column 'b' of row 1
>>> t[0:2]['b'] = 100.0         # Set column 'b' of rows 0 and 1
>>> print(t)
 a    b    c
      s
--- ----- ---
 -1 100.0   x
  8 100.0   W
 30   8.2   z
Add, remove, and rename columns with the following:
>>> t['d'] = [1, 2, 3]
>>> del t['c']
>>> t.rename_column('a', 'A')
>>> t.colnames
['A', 'b', 'd']
Adding a new row of data to the table is as follows:
>>> t.add_row([-8, -9, 10])
>>> len(t)
4
Lastly, one can create a table with support for missing values, for example by setting masked=True:
>>> t = Table([a, b, c], names=('a', 'b', 'c'), masked=True)
>>> t['a'].mask = [True, True, False]
>>> t
<Table rows=3 names=('a','b','c')>
masked_array(data = [(--, 2.0, 'x') (--, 5.0, 'y') (5, 8..., 'z')],
             mask = [(True, False, False) (True, False, False) (False, False, False)],
       fill_value = (999999, 1e+20, 'N'),
            dtype = [('a', '<i8'), ('b', '<f8'), ('c', 'S1')])
>>> print(t)
 a   b   c
--- --- ---
 -- 2.0   x
 -- 5.0   y
  5 8.2   z
The details of using astropy.table are provided in the following sections:
| hstack(tables[, join_type, uniq_col_name, ...]) | Stack tables along columns (horizontally) A join_type of ‘exact’ means that the tables must all have exactly the same number of rows. | 
| join(left, right[, keys, join_type, ...]) | Perform a join of the left table with the right table on specified keys. | 
| vstack(tables[, join_type, metadata_conflicts]) | Stack tables vertically (along rows) A join_type of ‘exact’ means that the tables must all have exactly the same column names (though the order can vary). | 
| Column | Define a data column for use in a Table object. | 
| ColumnGroups(parent_column[, indices, keys]) | |
| Conf | Configuration parameters for astropy.table. | 
| MaskedColumn | Define a masked data column for use in a Table object. | 
| Row(table, index) | A class to represent one row of a Table object. | 
| Table([data, masked, names, dtype, meta, ...]) | A class to represent tables of heterogeneous data. | 
| TableColumns([cols]) | OrderedDict subclass for a set of columns. | 
| TableFormatter | |
| TableGroups(parent_table[, indices, keys]) | |
| TableMergeError | 
