Tutorial

Python Tutorial: The Complete Guide for Data Analysts (2026)

Master Python programming with this comprehensive python tutorial for data analysts: variables, data structures, control flow, functions, NumPy, Pandas, and real-world projects.

Anuj SainiSep 8, 202616 min read

Welcome to the definitive python tutorial for aspiring and practicing data analysts. Python is the world's most versatile programming language, reigning as the undisputed standard for data analysis, statistical modeling, machine learning, and workflow automation. While general-purpose programmers study algorithms and web servers, data analysts learn Python to manipulate tabular frames, merge disparate data extracts, clean messy attributes, and extract high-conviction business insights.

If you are charting a structured career transition, map your progression with our Data Analyst Roadmap and reinforce your learning in our Python Tutorials Hub. For a guided, interactive coding environment with instant test feedback, enroll in our free Python for data analytics course.


Monthly global searches for Python tutorial

Python is ranked #1 on the TIOBE Index and PYPL Popularity Index, powering 84% of modern data science and business analytics production pipelines.


Why This Python Tutorial Focuses on Data Analytics

Most programming courses teach computer science from an application-developer perspective: object-oriented hierarchies, inheritance polymorphism, memory management, and web routing. For data analysts, that approach creates unnecessary friction and delays hands-on data manipulation.

This python tutorial is intentionally architected around the analyst lifecycle:

  1. Ingest: Pulling raw records from CSVs, Parquet files, SQL warehouses, and REST APIs.
  2. Transform: Reshaping, pivoting, merging, filtering, and sanitizing columns.
  3. Analyze: Calculating statistical aggregates, group distributions, rolling metrics, and cohort conversions.
  4. Communicate: Exporting summary reports, visual charts, and automated reporting data frames.

To explore the overarching architectural framework of Python for analytics, read our masterclass on Python fundamentals for analysts and practice hands-on exercises in the Python basics workbook.

Modern data analytics also requires understanding where Python fits alongside SQL and spreadsheet software. In high-maturity teams, SQL executes preliminary database aggregations, while Python handles exploratory modeling, irregular string cleanup, statistical hypothesis validation, and repetitive report scheduling. Mastering both tools empowers you to tackle any analytical challenge.


Python Tutorial: Environment Setup and Basics

Before writing code, analysts need a reliable local or cloud development environment. Modern data analytics workflows run primarily in Jupyter Notebooks and VS Code.

Setting Up Your Environment

  • Jupyter Notebook / JupyterLab: The industry-standard interactive computational notebook. It allows you to run code in blocks (cells), view intermediate tabular outputs immediately, and document your reasoning with markdown.
  • VS Code: A lightweight, professional code editor equipped with the Microsoft Python extension and integrated Jupyter support. To configure database connections directly inside your editor, follow our guide on VS Code SQLTools PostgreSQL setup.
  • Google Colab: A zero-setup cloud notebook environment running in the browser, offering free compute resources and seamless Google Drive file access.

The First Python Script

In Python, writing output to the console is as simple as executing print():

python
# First python script
greeting = "Hello, Data Analyst!"
print(greeting)

Unlike Java, C++, or C#, Python uses dynamic typing, clean indentation instead of curly braces, and readable, plain-English keywords. Indentation in Python is semantic: code blocks nested under control flow statements or function definitions must be indented by exactly 4 spaces.

python
total_sales = 15000
if total_sales > 10000:
    print("Target achieved!")
    bonus = total_sales * 0.05
    print(f"Bonus calculated: ${bonus:,.2f}")

Core Python Tutorial: Variables and Data Types

In Python, variables store references to values in memory without requiring explicit type declarations. Python automatically determines whether a variable holds an integer, float, string, or boolean.

python
# Core primitive data types
record_id = 10452               # int: whole numbers
order_value = 89.95             # float: decimal numbers
customer_tier = "Enterprise"    # str: text strings
is_churn_risk = False           # bool: logical True or False
notes = None                    # NoneType: represents missing or null values

Type Conversion (Casting)

When reading input streams or messy CSV files, numeric values frequently arrive formatted as strings. You must cast them into appropriate numeric types before performing arithmetic:

python
raw_price = "149.99"
raw_quantity = "3"
 
# Convert to float and int
clean_price = float(raw_price)
clean_quantity = int(raw_quantity)
 
total_cost = clean_price * clean_quantity
print(f"Total: ${total_cost:.2f}")  # Total: $449.97

Attempting to perform arithmetic on strings directly concatenates them rather than adding, resulting in silent calculation errors ("10" + "20" produces "1020", not 30).

Working with Strings

Strings represent text attributes: customer names, transaction memos, SKU descriptions, and email domains. Analysts frequently perform cleaning, splitting, slicing, and formatting:

python
raw_email = "  SARAH.CONNOR@CYBERDYNE.COM \n"
clean_email = raw_email.strip().lower()
domain = clean_email.split("@")[1]
print(f"Cleaned: {clean_email} | Domain: {domain}")
# Cleaned: sarah.connor@cyberdyne.com | Domain: cyberdyne.com

Common string methods every analyst uses daily:

  • .strip(): Removes leading and trailing whitespace, carriage returns, and tabs.
  • .lower() and .upper(): Standardizes case across dimension keys for reliable merging.
  • .replace(old, new): Substitutes target substrings, such as removing dollar signs ("$1,200".replace("$", "").replace(",", "")).
  • .startswith(prefix) and .endswith(suffix): Evaluates boolean pattern conditions.
  • .split(delimiter): Divides a string into a list of constituent substrings.

To hone string cleaning algorithms, master regex pattern matching, and solve real string parsing prompts, complete our string assignments workbook.


Control Flow and Looping Patterns

Decision-making and iterative processing allow analysts to filter records, branch business logic, and automate batch operations across directories of files.

Conditional Logic: if, elif, and else

python
discount_rate = 0.0
annual_spend = 12500
 
if annual_spend >= 20000:
    discount_rate = 0.20
elif annual_spend >= 10000:
    discount_rate = 0.10
elif annual_spend >= 5000:
    discount_rate = 0.05
else:
    discount_rate = 0.0
 
print(f"Assigned Discount Rate: {discount_rate:.0%}")

Logical Operators: and, or, and not

You can combine multiple criteria within conditional expressions:

python
is_vip = True
account_age_months = 14
 
if is_vip and account_age_months > 12:
    status = "Priority Support Access"
elif is_vip or account_age_months > 24:
    status = "Standard Expedited Access"
else:
    status = "General Queue"

Iterating with for Loops and Comprehensions

While analysts prioritize vectorized operations in Pandas, standard Python loops are indispensable for file iteration, API polling, and custom dictionary mappings:

python
revenues = [1200, 3400, 5600, 2100, 8900]
 
# Standard loop
tax_amounts = []
for rev in revenues:
    tax_amounts.append(rev * 0.18)
 
# Pythonic list comprehension
tax_amounts_comp = [rev * 0.18 for rev in revenues if rev > 2000]
print(tax_amounts_comp)

List comprehensions provide concise syntax for transforming iterable elements into a new list. They execute faster than standard manual .append() loops because bytecode evaluation occurs at C speed within the Python interpreter.


Data Structures: Lists, Dictionaries, and Tuples

Organizing raw data in native Python collections is a critical prerequisite to mastering relational frames.

Feature / Criteria

Practical Dictionary Workflows

JSON API responses and NoSQL database records map directly to Python dictionaries:

python
user_profile = {
    "user_id": 9821,
    "email": "alex@analytics.co",
    "country": "India",
    "orders": 14,
    "total_spend": 1420.50
}
 
# Safe key retrieval with default fallbacks
referral_code = user_profile.get("referral_code", "ORGANIC")
print(f"User {user_profile['user_id']} joined via {referral_code}")

Using .get() prevents unhandled KeyError crashes when processing external datasets where optional fields may be omitted.

Sets for Deduplication and Membership Testing

Sets store unique elements and support mathematical set operations (union, intersection, difference):

python
active_users_jan = {"usr_1", "usr_2", "usr_3", "usr_4"}
active_users_feb = {"usr_3", "usr_4", "usr_5", "usr_6"}
 
# Churned users (active in Jan but missing in Feb)
churned = active_users_jan - active_users_feb
print(f"Churned users: {churned}")
 
# Retained users (active in both months)
retained = active_users_jan & active_users_feb
print(f"Retained users: {retained}")

To test your ability to nest, iterate, and transform complex collections, work through our dedicated lists and dicts assignments.


Writing Reusable Functions and Modules

Analysts write functions to encapsulate business formulas, standardize date cleaning, and prevent repetitive code duplication across analysis notebooks.

python
def calculate_churn_rate(start_subscribers: int, lost_subscribers: int) -> float:
    """Calculates period churn rate safely preventing ZeroDivisionError."""
    if start_subscribers <= 0:
        return 0.0
    return round((lost_subscribers / start_subscribers) * 100, 2)
 
churn = calculate_churn_rate(1250, 45)
print(f"Monthly Churn: {churn}%")

Function Scope and Default Arguments

Functions can accept default arguments, allowing users to override specific parameters only when necessary:

python
def format_currency(amount: float, symbol: str = "$", decimals: int = 2) -> str:
    """Formats a float into an aligned currency string."""
    return f"{symbol}{amount:,.{decimals}f}"
 
print(format_currency(14850.5))       # $14,850.50
print(format_currency(14850.5, "₹"))   # ₹14,850.50

Organizing utility functions into clean .py helper modules lets you import business logic across multiple notebooks without copy-pasting code.


Numerical Computing with NumPy Foundations

NumPy (Numerical Python) is the computational backbone of scientific computing in Python. It provides the homogeneous ndarray (N-dimensional array) data structure, implemented in C for blazing performance.

python
import numpy as np
 
# Creating arrays
sales = np.array([45000, 52000, 61000, 58000, 72000])
 
# Vectorized arithmetic (operates element-wise without loops)
sales_with_bonus = sales * 1.15
mean_sales = np.mean(sales)
std_sales = np.std(sales)
 
print(f"Mean: ${mean_sales:,.2f} | Std Dev: ${std_sales:,.2f}")

Slicing and Boolean Masking

NumPy arrays support multi-dimensional slicing and high-speed boolean indexing:

python
# Create a 2D matrix (3 quarters x 4 regions)
performance = np.array([
    [120, 140, 130, 160],
    [150, 175, 165, 190],
    [180, 210, 195, 240]
])
 
# Extract all regions where quarter revenue exceeded 180
high_performers = performance[performance > 180]
print(high_performers)

NumPy vectorization executes calculations hundreds of times faster than standard Python loops by leveraging contiguous memory blocks and SIMD CPU vector instructions. Dive into broadcasting, matrix slicing, and statistical functions in our complete guide to NumPy foundations.


Data Wrangling with Pandas Fundamentals

If NumPy is the engine, Pandas is the steering wheel. The Pandas library provides the Series (1D labeled array) and DataFrame (2D labeled tabular data structure) that make data wrangling intuitive and expressive.

python
import pandas as pd
 
# Creating a DataFrame
data = {
    "customer_id": [101, 102, 103, 104],
    "segment": ["Enterprise", "SMB", "Enterprise", "Consumer"],
    "arr": [48000, 12000, 65000, 3200],
    "renewed": [True, True, False, True]
}
 
df = pd.DataFrame(data)
print(df)

Filtering and Selecting Rows

python
# Filtering rows with boolean indexing
high_value_enterprise = df[(df["segment"] == "Enterprise") & (df["arr"] > 50000)]
print(high_value_enterprise)

GroupBy and Aggregations

Mirroring SQL's GROUP BY clause, Pandas aggregates summary metrics across dimension categories with minimal syntax:

python
segment_summary = df.groupby("segment").agg(
    total_revenue=("arr", "sum"),
    avg_revenue=("arr", "mean"),
    customer_count=("customer_id", "count")
).reset_index()
 
print(segment_summary)

Handling Missing Values (Nulls)

Real-world datasets contain missing entries resulting from dropped API connections, uncompleted onboarding forms, or optional fields:

python
# Inspect missing counts
print(df.isnull().sum())
 
# Drop rows with missing targets
df_clean = df.dropna(subset=["arr"])
 
# Impute missing values
df["segment"] = df["segment"].fillna("Unassigned")

Master the full API with our dedicated guides:


Exploratory Data Analysis and Visualization

Exploratory Data Analysis (EDA) is the iterative process of investigating a dataset to understand distributions, detect anomalies, test hypotheses, and verify assumptions through summary statistics and visual representations.

Key EDA Steps

  1. Inspecting Structure: Checking column data types, memory footprints, and row dimensions with df.info() and df.shape.
  2. Missing Value Audits: Calculating null percentages across columns with df.isnull().sum() / len(df).
  3. Statistical Outliers: Generating summary quartiles with df.describe() and identifying distribution skews.
  4. Correlation Analysis: Examining linear relationships between numeric metrics with df.corr().

Building Visual Charts with Matplotlib and Seaborn

Visualizations validate statistical observations and surface patterns hidden within aggregate tables:

python
import matplotlib.pyplot as plt
import seaborn as sns
 
# Configure plot style
sns.set_theme(style="whitegrid")
 
plt.figure(figsize=(10, 6))
sns.barplot(data=segment_summary, x="segment", y="total_revenue", palette="Blues_d")
plt.title("Total Revenue by Customer Segment")
plt.xlabel("Segment")
plt.ylabel("Annual Recurring Revenue ($)")
plt.tight_layout()
plt.show()

Explore end-to-end analytical playbooks:


Connecting Python to Databases and APIs

Real analytics workflows rarely start with clean CSVs sitting on your desktop. Data analysts must query production relational databases and ingest webhooks directly from REST APIs.

Querying SQL Databases with SQLAlchemy and Pandas

python
from sqlalchemy import create_engine
import pandas as pd
 
# Connect to warehouse
engine = create_engine("postgresql://analyst:secret@db.company.com:5432/analytics")
 
# Execute SQL query directly into a DataFrame
query = """
SELECT region, SUM(amount) AS total_sales
FROM fact_orders
WHERE order_date >= '2026-01-01'
GROUP BY region
ORDER BY total_sales DESC;
"""
 
df_sales = pd.read_sql(query, engine)
print(df_sales.head())

Ingesting Data from REST APIs

Modern web applications exchange data via REST endpoints returning JSON payloads. Python's requests library provides seamless ingestion:

python
import requests
import pandas as pd
 
response = requests.get("https://api.example.com/v1/metrics", headers={"Authorization": "Bearer TOKEN"})
if response.status_code == 200:
    data = response.json()
    df_metrics = pd.json_normalize(data["results"])
    print(df_metrics.head())
else:
    print(f"API Error: {response.status_code}")

Master database connections, transaction isolation, and connection pooling in our database connectivity guide. To extract data from SaaS web APIs, review our Python API data extraction guide.


Python Tutorial: End-to-End Analytics Pipeline Example

To consolidate everything covered in this python tutorial, let us assemble a real-world automated pipeline script. This pattern mirrors production workflows where an analyst ingests an export, standardizes corrupt attributes, aggregates business metrics, and saves clean artifacts for downstream reporting.

python
import pandas as pd
import numpy as np
from datetime import datetime
 
def run_daily_sales_pipeline(raw_csv_path: str, output_path: str) -> pd.DataFrame:
    """Ingests, cleans, enriches, and summarizes daily ecommerce orders."""
    # 1. Ingestion
    print(f"[{datetime.now().strftime('%H:%M:%S')}] Ingesting {raw_csv_path}...")
    df = pd.read_csv(raw_csv_path)
    
    # 2. Schema Validation and Column Sanitization
    df.columns = [col.strip().lower().replace(" ", "_") for col in df.columns]
    
    # 3. String Cleaning and Type Casting
    df["customer_email"] = df["customer_email"].astype(str).str.strip().str.lower()
    df["order_date"] = pd.to_datetime(df["order_date"], errors="coerce")
    df["revenue"] = pd.to_numeric(df["revenue"].astype(str).str.replace("$", "").str.replace(",", ""), errors="coerce")
    
    # 4. Outlier and Missing Value Hygiene
    df = df.dropna(subset=["order_date", "revenue"])
    df = df[df["revenue"] > 0]  # Strip test orders or invalid negative charges
    
    # 5. Feature Engineering
    df["order_month"] = df["order_date"].dt.to_period("M")
    df["is_large_order"] = np.where(df["revenue"] >= 500, "High Value", "Standard")
    
    # 6. Aggregation and Summary Rollup
    monthly_summary = df.groupby(["order_month", "is_large_order"]).agg(
        total_revenue=("revenue", "sum"),
        order_count=("order_id", "count"),
        avg_order_value=("revenue", "mean")
    ).reset_index()
    
    # 7. Formatting and Export
    monthly_summary["avg_order_value"] = monthly_summary["avg_order_value"].round(2)
    monthly_summary.to_csv(output_path, index=False)
    print(f"[{datetime.now().strftime('%H:%M:%S')}] Pipeline complete! Exported to {output_path}")
    
    return monthly_summary

Notice the defensive design principles applied throughout: column headers are normalized automatically, strings undergo .strip() and .lower(), errors are coerced gracefully to prevent script termination on corrupted records, and calculations are vectorized using np.where. Running pipelines structured like this across cron jobs or scheduled workers saves business teams countless manual hours each week.


Python Interview Questions and Best Practices

Technical interview loops test your depth of understanding regarding Python internals, Pandas efficiency, and problem-solving velocity.

Essential Best Practices

Avoid Chained Indexing (SettingWithCopyWarning)

Never update DataFrame values using chained brackets like df['col'][mask] = val. This causes ambiguous evaluations between views and copies, generating a SettingWithCopyWarning. Always use .loc[mask, 'col'] = val.

Vectorization vs apply() vs iterrows()

Avoid iterrows() at all costs — it converts each row into a Pandas Series, slowing down execution by 100x to 1,000x. Prefer native vectorized operations first, np.select or np.where second, and .apply() only when vectorization is mathematically impossible.

Interview Preparation Resources

Prepare for hiring screens with our targeted question banks:


Defensive Python Programming: Virtual Environments and Type Hinting

As analytics scripts scale from exploratory notebooks to automated production jobs, adopting software engineering best practices is critical:

  • Virtual Environments (venv): Isolate project dependencies to prevent version conflicts across packages:
    bash
    python3 -m venv .venv
    source .venv/bin/activate
    pip install pandas numpy scikit-learn
  • Type Annotations: Modern Python 3 supports type hinting to make data manipulation functions self-documenting and verifiable with mypy:
    python
    from typing import List, Dict, Optional
    import pandas as pd
     
    def calculate_churn_rate(df: pd.DataFrame, period: str = 'M') -> float:
        active_users: int = df['user_id'].nunique()
        churned_users: int = df[df['status'] == 'churned']['user_id'].nunique()
        return churned_users / active_users if active_users > 0 else 0.0
  • Modular Packaging: Move reusable data cleaning functions into dedicated .py modules, enabling clean imports across multiple Jupyter notebooks without copy-pasting code blocks.

Explore our complete Python for Data Analysis hub and practice interactive coding on Topfolio Free Python Course.

Continue your technical journey with these foundational guides:

Learn Python for Data Analytics Free

Build portfolio projects, solve interactive challenges, and master Pandas and NumPy with our project-based curriculum.

Start Free Python Course

Frequently Asked Questions

Is this Python tutorial suitable for complete beginners?

Yes. This Python tutorial starts from zero: basic syntax, variables, and primitive data types, before progressing step-by-step through lists, dictionaries, functions, NumPy arrays, and Pandas DataFrames.

How long does it take to learn Python for data analysis?

With consistent daily practice of 1-2 hours, an analyst can master core Python fundamentals within 3 weeks, data manipulation libraries (NumPy and Pandas) within another 3 weeks, and complete their first portfolio project in week 8.

Do I need computer science fundamentals to learn this Python tutorial?

No. Data analysts use Python as a computational and transformation tool, not for building operating systems. You only need to understand basic logic, data structures, and tabular operations.

What is the difference between Python for software engineering vs Python for data analysis?

Software engineering emphasizes OOP design patterns, concurrency, and system architecture. Data analytics focuses on vectorization, data wrangling with Pandas, statistical aggregation, exploratory data analysis (EDA), and data storytelling.

How should I practice this Python tutorial interactively?

You should run code alongside each section in a Jupyter notebook or Google Colab, complete our structured assignments, and enroll in our free Python for data analytics course.

Anuj Saini

Written by

Anuj SainiFounder & Lead Instructor

Founder at Topfolio with 6+ years in data & analytics across JPMC, Ultrahuman, and high-growth startups. Sat on hiring panels, reviewed 500+ resumes, and writes practical SQL & data guides.