refactor to_dataframe