Data Cleaning in Python: A Practical Guide
SkillVeris Team
Data Science Team

Data cleaning is the process of detecting and fixing errors — missing values, duplicates, wrong types, inconsistent formats, and outliers — so your analysis rests on trustworthy data.
In this guide, you'll learn:
- It is typically the largest time sink in a data project, and skipping it produces garbage-in, garbage-out results.
- Pandas is the standard tool: read data, inspect it, handle missing values, deduplicate, fix types, and standardize text.
- Always inspect before you clean — .info(), .describe(), and .isna().sum() reveal what is actually wrong.
- Decide deliberately whether to drop or impute missing values; each choice changes your results.
1What Is Data Cleaning?
Data cleaning is the process of finding and correcting problems in a dataset so it is accurate, consistent, and ready to analyze. Common problems include missing values, duplicate rows, wrong data types, inconsistent text formats, and outliers. Cleaning turns messy raw data into a reliable foundation for analysis and machine learning.
It is not glamorous, but it is decisive. Real-world data is almost never tidy, and analysts routinely spend the majority of a project just getting the data into usable shape. Skip it and every downstream conclusion is suspect.
2Inspect Before You Clean
You cannot fix what you have not measured. The first move on any new dataset is to inspect it: check its shape, column types, summary statistics, and where values are missing. Pandas gives you a handful of one-liners that surface most problems immediately, so run them before changing anything.
- import pandas as pd
- df = pd.read_csv('data.csv')
- df.shape # rows and columns
- df.info() # dtypes and non-null counts
- df.describe() # numeric summary stats
- df.isna().sum() # missing values per column
- df.head() # eyeball the first rows
💡Look Before You Leap
Spend real time in the inspection step. Most cleaning mistakes come from acting on assumptions instead of what df.info() and df.describe() actually show.
3Handling Missing Values
Missing values are the most common data problem, and you have two broad choices: remove them or fill them in. Dropping rows or columns is simple but throws away information. Imputation — filling gaps with a sensible substitute like the mean, median, or a category placeholder — preserves rows but introduces assumptions. The right call depends on how much is missing and why.
- df.dropna() # drop any row with a missing value
- df.dropna(subset=['age']) # drop only where age is missing
- df['age'].fillna(df['age'].median()) # impute with the median
- df['city'].fillna('Unknown') # placeholder for missing text
Median Over Mean for Skewed Data
When a numeric column is skewed or has outliers, the median is a more robust fill value than the mean, because a few extreme values will not drag it around.
4Duplicates and Data Types
Duplicate rows inflate counts and bias averages, so find and remove them early. Equally important is fixing data types: numbers stored as text will not do math, and dates stored as strings will not sort or filter correctly. Converting columns to their proper types unlocks the right operations and catches hidden errors.
- df.duplicated().sum() # how many duplicate rows
- df = df.drop_duplicates() # remove them
- df['price'] = pd.to_numeric(df['price'], errors='coerce') # text to number
- df['date'] = pd.to_datetime(df['date']) # string to datetime
⚠️errors='coerce' Hides Problems
Using errors='coerce' turns unparseable values into NaN silently. That is convenient, but check how many new NaNs it created so bad rows do not vanish unnoticed.
5Standardizing Text and Categories
Inconsistent text is a quiet source of errors. 'USA', 'usa', and ' United States ' may all mean the same country but count as three categories. Standardizing case, trimming whitespace, and mapping variants to a canonical value collapses these duplicates. Clean categorical data is essential before grouping, counting, or encoding for a model.
- df['country'] = df['country'].str.strip().str.title()
- df['email'] = df['email'].str.lower()
- df['status'] = df['status'].replace({'y': 'Yes', 'n': 'No'})
- df['country'].value_counts() # verify categories collapsed correctly
6Detecting Outliers
Outliers are values far outside the normal range — a person aged 999, a negative price. Some are genuine and important; others are data-entry errors. Detect them with summary statistics and simple rules like the interquartile range, then decide case by case whether to keep, cap, or remove them. Never delete outliers blindly, because they sometimes carry the most valuable signal.
- q1 = df['price'].quantile(0.25)
- q3 = df['price'].quantile(0.75)
- iqr = q3 - q1
- low, high = q1 - 1.5 * iqr, q3 + 1.5 * iqr
- outliers = df[(df['price'] < low) | (df['price'] > high)]
7Common Mistakes to Avoid
Steer clear of these habits that quietly corrupt an analysis.
- Cleaning before inspecting, so you fix the wrong things or miss real problems.
- Dropping every row with a missing value and unknowingly discarding most of the data.
- Editing the raw source file in place instead of scripting reproducible transformations.
- Deleting outliers automatically when some are legitimate and meaningful.
- Forgetting to verify results after each step with value_counts() or isna().sum().
8Key Takeaways
Carry these principles into every cleaning task.
- Inspect first with info(), describe(), and isna().sum() before changing anything.
- Choose drop vs impute deliberately — each changes your results.
- Remove duplicates and fix data types early.
- Standardize text and categories so groupings are accurate.
- Keep cleaning steps in a script or notebook so they are reproducible.
9Frequently Asked Questions
Q: How much of a data project is spent cleaning? A: For most real datasets, cleaning and preparation are the single largest phase, often taking more time than modeling or analysis. Raw data is rarely tidy, so budget for it rather than treating it as an afterthought.
Q: Should I drop or fill missing values? A: It depends on how much is missing and why. Drop rows when only a few are affected and the loss is negligible; impute with median, mean, or a placeholder when dropping would discard too much data. Document whichever you choose.
Q: What library should I use for data cleaning in Python? A: Pandas is the standard for tabular data cleaning, covering reading, inspection, missing values, deduplication, type conversion, and text standardization. NumPy supports it for numerical operations.
Q: How do I make my cleaning reproducible? A: Write the steps in a script or notebook that reads the raw file and applies each transformation in order, rather than editing the source manually. Anyone can then rerun it and get identical, auditable results.
Related Reading
Get The Print Version
Download a PDF of this article for offline reading.
About the Publisher
SkillVeris Team
Data Science Team
Our data team shares real-world analytics, ML, and SQL insights grounded in industry practice.
View all postsRelated Posts
Never miss an update
Get the latest tutorials and guides delivered to your inbox.
No spam. Unsubscribe anytime.