What are the tradeoffs between implenting dataframes as a series of columns vs a series of tuples
At the level of an actual implementation, Array of structures versus structure of arrays makes an enormous performance difference; particularly when SIMD parallelism is involved.  If you want to add together all of the values of one field, then all of those values are sitting next to each other.

SIMD instructions add/mul entire arrays all at once, rather than looping over each struct member.  If you need to jump around memory to add all of these, you will invalidate memory caches.  Also, suppose that only one column has non-default values, and the other dozen columns have zero values.  The implementation can simply not bring over columns that are all zero.  Run-length coding can be used on columns, or differential encoding.

In the BigData world, there are different serialization standards in use.  Parquet is one option, picked because it has these characteristics due to being a columnar format.  These kinds of formats are oriented towards doing stream processing.  For example: you can get the next 1024 rows as a batch out of a cursor, but as an implementation detail they are packed in a columnar format.