RowCollector
Scripts can often produce tabulated data row by row, but the amount of data does not require usage of overcomplicated libraries like pandas
. RowCollector
is a simple and quick tool that can collect such data and manipulate it with a minimalistic and clean approach.
In the example below, we create a table with three columns ['col1','col2','col3']
. Rows can be appended at the initialization [[1,2,3],[4,5,6]]
, and/or appended later [7,8,0]
. Individual columns can be accessed using selectors, or as object attributes.
>>> from scinumtools import RowCollector
>>>
>>> columns = ['col1','col2','col3']
>>> rows = [[1,2,3],
>>> [4,5,6]]
>>>
>>> with RowCollector(columns,rows) as rc:
>>> rc.append([7,8,0])
>>> rc.size()
3
>>> rc.shape()
(3, 3)
>>> rc.col1
[1, 4, 7]
>>> rc['col2']
[2, 5, 8]
RowCollector
object can also be quickly converted into a dictionary, pandas
DataFrame, plain text, or export
tabulated values as a CSV and text format.
>>> with RowCollector(columns,rows) as rc:
>>> rc.to_dict()
{'col1': [1, 4], 'col2': [2, 5], 'col3': [3, 6]}
>>> rc.to_dataframe()
col1 col2 col3
0 1 2 3
1 4 5 6
>>> rc.to_text()
' col1 col2 col3\n0 1 2 3\n1 4 5 6'
>>> rc.to_csv('data.csv')
>>> rc.to_file('table.txt')
It is also possible to specify properties of individual columns using numpy
arrays.
>>> rows = [[0,1,2],[3,4,5]]
>>> columns = {
>>> 'col1':dict(dtype=bool),
>>> 'col2':dict(dtype=str),
>>> 'col3':dict(dtype=float),
>>> }
>>> with RowCollector(columns, rows, array=True) as rc:
>>> rc.to_dict()
{'col1': array([False, True]),
'col2': array(['1', '4'], dtype='<U1'),
'col3': array([2., 5.])}
Sometimes it is easier to define columns together with the first row. In this case, the values are apppended in a form of a dictionary.
>>> with RowCollector() as rc:
>>> rc.append({'col1': 1, 'col2': 2})
>>> rc.append({'col1': 3, 'col2': 4})
>>> rc.to_dict()
{'col1': [1, 3], 'col2': [2, 4]}
One can also sort such table according to values in one of the columns.
>>> with RowCollector(columns, rows, array=True) as rc:
>>> rc.to_text()
col1 col2 col3
0 False 1 2.0
1 True 4 5.0
>>> rc.sort('col1', reverse=True)
>>> rc.to_text()
col1 col2 col3
0 True 4 5.0
1 False 1 2.0