Function for comparing DataFrames in tests

Doesn't depend on row/column ordering and can handle null values.