PyNastran uses numpy for almost everything, but there is an option for pandas DataFrames, which are useful in the Jupyter/iPython notebook.
I took a look at the source for FeResPost the other day and it looks as if it reads about 15-20 different result types from the OP2. PyNastran reads many more (though to be fair XDB is the preferred method). What wasn't clear to me was what the data structure actually was.
PyNastran uses a dictionary to store OP2 results, where the key is a tuple of (subcase ID, subtitle, optimization step, a few other things) and the value is a Python class (e.g. DisplacementArray, RealRodForceArray). The extra key parameters are required for things like superelements and SOL 200 and single subcase buckling. Static and transient results (or multiple superelements) can have the same subcase ID. Without the extra keys in the tuple, data will be lost/mangled. For simple cases, it's possible to reduce that key down to a single subcase ID, which is the default. Regarding the RealRodForceArray class, that stores a numpy 1d array of elements and a numpy 3d array of data, where the data is [ntimes, nelements, nresults] in shape. Additionally, OP2 parameters (e.g. table name, analysis code, format code, etc.) are dynamically associated with the class. All other result classes follow that style and all OP2 results can write an F06.
Regarding the BDF, 267 cards are supported using a Python class for each card object typically in a dictionary. I'm not sure what FeResPost does.
My guess is it would be a lot of work to create the data in C++ and it's beyond my skill level. The pandas work was also beyond me, but some people made a few good examples and I was able to add it for the other classes pretty quickly, so there's always that option.
Steve