Is there a way to purge old data in a table?
Your interpretation of why you're getting duplicate columns when looping your  your table field is wrong.

Each column is always accessible via a automatically generated column handle (col1, col2, etc.), so that's not old and left over column names you're seeing there.

If you define custom handles in the Table field's settings, the cells' data will  be available via those properties as well, so you can then access the value via both row.price and row.col1. This feature is designed with direct access of columns / cells in mind, but gets in the way when looping through a row's cells. 

But Craft doesn't force you to define custom handles, so you can simply remove them in your field's settings and your "old data" will be removed.