A column's dtype is usually decided when the data is loaded, by pandas guessing from the values.
One bad value is enough to change the guess for the whole column.
A price column with the word unknown in one row becomes object, the general type pandas uses for text.
Object columns are slow and use far more memory, because each entry is a separate Python object.
A whole number column with any blanks becomes float64, because the standard integer type has no way to mark a blank.
pandas also offers nullable types such as Int64, with a capital I, which can hold blanks.
Dates read from a CSV file arrive as text unless parsed, so sorting them sorts alphabetically.
Converting them with to_datetime makes date maths work, such as the number of days between two orders.
Day and month order is ambiguous, so 03/04 can mean 3 April or 4 March, and the format should be stated.
Text with a few repeated values, such as region names, can use the category dtype.
A category column stores each label once and uses small codes for the rows, which can cut memory sharply.
Converting float64 to float32 halves the memory but loses precision, which matters for money.
Money is often stored as whole pennies in an integer column to avoid rounding drift.
Looking at the dtypes or calling info straight after loading is the habit that catches most of these issues.
The common mistake is trusting the totals before checking the types that produced them.