Compared to general relations, data frames contain the following additional structure:
* The rows, and the data in each column, are totally ordered.
* The rows, and the values in each column, are labeled by indexes.
* The row and column indexes can each have an internal hierarchical structure.
Here is how these structures can be modeled within the standard relational framework:
* Introduce another attribute, that for the row labels.
* Add a total ordering on this attribute.
* For the hierarchy, simply consider the fact that the row labels may consist of $n$-tuples.
* Similarly, if it's not there already, introduce a total ordering on the attributes.
* Introduce a labeling function for the columns, and consider the fact that the columns labels may consist of $k$-tuples.
Two ways of looking at the same thing, but, at least for practical purposes, it is useful to take the above-given definition of a DataFrame is useful as a consolidated starting point, with a clear visualization as a table with labeled row and column axes.