100% Free Forever
AI-Powered Learning
Industry Expert Content
Certificates & Badges
Learn At Your Own Pace
Python

Data Type Conversion

Master how to inspect and convert pandas column dtypes with astype, to_numeric, to_datetime, and category types to fix incorrect or inefficient typing.

Data CleaningBeginner8 min readJul 8, 2026
Analogies

Data Type Conversion

Data loaded from CSVs, APIs, or databases frequently arrives with the wrong dtype — numbers stored as strings, dates stored as objects, low-cardinality text that should be a memory-efficient category. Getting dtypes right isn't cosmetic: it affects which operations are even valid (you can't compute a mean on a string column), how much memory a DataFrame consumes, and how fast vectorized operations run, since pandas dispatches to specialized, type-aware C implementations only when dtypes are correctly set.

🏏

Cricket analogy: A scorecard CSV storing 'runs' as text like '45' instead of a number means you can't compute a team's average, waste memory storing digits as strings, and lose the fast vectorized math pandas gives you once the column is properly numeric.

Inspecting and converting with astype and to_numeric

df.dtypes lists the dtype of every column; df.info() adds memory usage and non-null counts. astype(dtype) performs a general-purpose conversion (to int, float, str, category, etc.) but raises an error if any value can't be cast, so it's brittle against dirty data like a stray '$1,200' in a numeric column. pd.to_numeric() is the more forgiving tool for numeric conversion: its errors='coerce' argument turns unparseable values into NaN instead of raising, which is invaluable for cleaning messy real-world columns before further analysis.

🏏

Cricket analogy: df.info() reveals the 'runs' column is stored as object type with 500 non-null entries; astype(int) crashes on a stray 'DNB' (did not bat) entry, but pd.to_numeric(errors='coerce') converts it to NaN cleanly, letting the rest of the scorecard parse.

python
import pandas as pd

df = pd.DataFrame({
    'price': ['19.99', '24.50', 'N/A', '31.00'],
    'category': ['electronics', 'electronics', 'home', 'home'],
    'purchased_at': ['2024-01-05', '2024-01-06', '2024-01-07', '2024-01-09'],
})

# Coerce bad values to NaN instead of raising
df['price'] = pd.to_numeric(df['price'], errors='coerce')
print(df['price'].dtype)   # float64 (NaN now sits at row index 2)

# Parse strings into real datetime64[ns] values
df['purchased_at'] = pd.to_datetime(df['purchased_at'])

# Low-cardinality text -> category dtype: much smaller memory footprint
df['category'] = df['category'].astype('category')

print(df.dtypes)
# price                  float64
# category              category
# purchased_at    datetime64[ns]

The category dtype and nullable integers

Converting a repetitive text column to 'category' stores each unique value once and represents rows as small integer codes, which can cut memory usage dramatically on large DataFrames and speed up groupby operations on that column. Separately, ordinary NumPy integer dtypes cannot hold NaN (any NaN forces the whole column to float64); pandas' nullable integer types (Int64, capital I) solve this by supporting pd.NA alongside true integer values, useful when a count column has missing entries but should never silently become fractional.

🏏

Cricket analogy: Converting a 'team' column with only 10 repeated names to category stores each name once and uses small codes, shrinking a huge match dataset and speeding up groupby('team'); a nullable Int64 'wickets' column keeps missing values as pd.NA instead of forcing decimals like 3.0.

astype('category') is one of the highest-leverage, lowest-effort memory optimizations in pandas: for a column with, say, 5 unique values repeated across a million rows, category storage can be an order of magnitude smaller than object/string storage, with no loss of information.

astype(int) on a column containing NaN raises an error (or silently corrupts values in older pandas versions) because standard NumPy integer dtypes have no way to represent missing values. Either fill/drop the NaNs first, or use the nullable 'Int64' extension dtype, which explicitly supports pd.NA.

  • df.dtypes and df.info() are the starting points for auditing column types and memory usage.
  • astype() performs strict conversion and raises on unparseable values; pd.to_numeric(errors='coerce') and pd.to_datetime() are more forgiving for messy real-world data.
  • Converting low-cardinality text columns to 'category' reduces memory and can speed up groupby operations.
  • Standard NumPy integer dtypes cannot hold NaN; use the nullable 'Int64' extension dtype when missing integer values are expected.
  • errors='coerce' is the standard pattern for turning unparseable values into NaN rather than crashing a pipeline.
  • Correct dtypes are a prerequisite for correct arithmetic, correct sorting, and full vectorized performance.

Practice what you learned

Was this page helpful?

Topics covered

#Python#PandasNumPyStudyNotes#DataScience#DataTypeConversion#Data#Type#Conversion#Inspecting#StudyNotes#SkillVeris