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.

* 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.