VOOZH about

URL: https://www.analyticsvidhya.com/blog/2023/12/mastering-tabulate/

⇱ Comprehensive Guide to Python's Tabulate Library - Analytics Vidhya


India's Most Futuristic AI Conference Is Back – Bigger, Sharper, Bolder

  • d
  • :
  • h
  • :
  • m
  • :
  • s

Comprehensive Guide to Python’s Tabulate Library

Aayush Tyagi Last Updated : 29 May, 2025
10 min read

Introduction

In the world of data processing and analysis, the way information is presented can be just as crucial as the data itself. Python’s Tabulate library serves as a powerful tool for creating visually appealing and well-formatted tables. This comprehensive guide will walk you through everything you need to know to master Tabulate and effectively present your data.

Getting Started with Tabulate

Before diving into the intricacies of Tabulate, it’s essential to have the library installed. Use the following pip command to install it:

pip install tabulate

After installation, importing the library into your Python scripts is as simple as:

from tabulate import tabulate

Want to learn about more such cool python libraries? Enroll for our FREE Python course today!

Creating Basic Tables

Creating basic tables using the `tabulate` library in Python is a straightforward process. The `tabulate` function takes a list of lists as input, where each inner list represents a row of the table, and an optional list for headers. Here’s a step-by-step explanation:

Create Data for the Table

   Define your data as a list of lists. Each inner list represents a row in the table:

data = [

       ["Alice", 24, "Engineer"],

       ["Bob", 30, "Data Scientist"],

       ["Charlie", 27, "Designer"]

   ]

In this example, each row represents a person with their name, age, and occupation.

Specify Headers (Optional)

If you have headers for your columns, create a separate list for them:

   headers = ["Name", "Age", "Occupation"]

Use the`tabulate` Function

Call the `tabulate` function, passing in the data and headers as arguments. Specify the desired table format using the `tablefmt` parameter (e.g., “grid”, “plain”, “html”, “markdown”):

   table = tabulate(data, headers, tablefmt="grid")

If you don’t have headers, you can omit the `headers` parameter:

   table = tabulate(data, tablefmt="grid")

Print or Display the Table

Finally, print or display the generated table:

   print(table)

The output will be a neatly formatted table with columns aligned:

+---------+-----+------------------+

   | Name    | Age | Occupation       |

   +---------+-----+------------------+

   | Alice   | 24  | Engineer         |

   | Bob     | 30  | Data Scientist  |

   | Charlie | 27  | Designer         |

   +---------+-----+------------------+

And that’s it! You’ve successfully created a basic table using the Tabulate library in Python. You can experiment with different table formats, explore formatting options, and customize the appearance of your tables based on your specific needs.

Formatting Options

The `tabulate` function in the Tabulate library provides various formatting options to customize the appearance of tables. The `tablefmt` parameter is used to specify the desired output format. Here are some commonly used formatting options:

Plain Text (`”plain”`)

This is the default format. It creates a simple, plain text table with aligned columns.

   table = tabulate(data, headers, tablefmt="plain")

Example Output:

Name    Age  Occupation

   Alice   24   Engineer

   Bob     30   Data Scientist

   Charlie 27   Designer

Grid (`”grid”`)

This format creates a table with grid lines separating the cells.

   table = tabulate(data, headers, tablefmt="grid")

Example Output:

+---------+-----+------------------+

   | Name    | Age | Occupation       |

   +---------+-----+------------------+

   | Alice   | 24  | Engineer         |

   | Bob     | 30  | Data Scientist  |

   | Charlie | 27  | Designer         |

   +---------+-----+------------------+

HTML (`”html”`)

This format generates an HTML table.

   table = tabulate(data, headers, tablefmt="html")

Example Output:

<table>

   <thead>

   <tr><th>Name</th><th>Age</th><th>Occupation</th></tr>

   </thead>

   <tbody>

   <tr><td>Alice</td><td>24</td><td>Engineer</td></tr>

   <tr><td>Bob</td><td>30</td><td>Data Scientist</td></tr>

   <tr><td>Charlie</td><td>27</td><td>Designer</td></tr>

   </tbody>

   </table>

Markdown (`”markdown”`)

This format generates a Markdown-formatted table.

   table = tabulate(data, headers, tablefmt="markdown")

Example Output:

| Name    | Age | Occupation       |

   |---------|-----|------------------|

   | Alice   | 24  | Engineer         |

   | Bob     | 30  | Data Scientist  |

   | Charlie | 27  | Designer         |

Latex ("latex")   

This format generates a LaTeX table.

   table = tabulate(data, headers, tablefmt="latex")

Example Output:

\begin{tabular}{ccc}

   \hline

   Name & Age & Occupation \\

   \hline

   Alice & 24 & Engineer \\

   Bob & 30 & Data Scientist \\

   Charlie & 27 & Designer \\

   \hline

   \end{tabular}

Org-Mode ("orgtbl")   

This format generates a table suitable for Org-Mode in Emacs.

   table = tabulate(data, headers, tablefmt="orgtbl")

Example Output:

| Name    | Age | Occupation       |

   |---------|-----|------------------|

   | Alice   | 24  | Engineer         |

   | Bob     | 30  | Data Scientist  |

   | Charlie | 27  | Designer         |

MediaWiki (`”mediawiki”`)

This format produces a table compatible with MediaWiki syntax.

   table = tabulate(data, headers, tablefmt="mediawiki")

Example Output:

{| class="wikitable"

   |+ 

   ! Name    !! Age !! Occupation

   |-

   | Alice   || 24  || Engineer

   |-

   | Bob     || 30  || Data Scientist

   |-

   | Charlie || 27  || Designer

   |}

TSV (Tab-Separated Values) ("tsv")

This format generates a tab-separated values table.

   table = tabulate(data, headers, tablefmt="tsv")

Example Output:

Name    Age    Occupation

   Alice   24     Engineer

   Bob     30     Data Scientist

   Charlie 27     Designer

JSON ("json")

This format outputs the table data in JSON format.

   table = tabulate(data, headers, tablefmt="json")

Example Output:

[

    {"Name": "Alice", "Age": 24, "Occupation": "Engineer"},

    {"Name": "Bob", "Age": 30, "Occupation": "Data Scientist"},

    {"Name": "Charlie", "Age": 27, "Occupation": "Designer"}

   ]

LaTeX (Long Table) ("latex_longtable")

This format is similar to the regular LaTeX format but is designed for longer tables that can span multiple pages.

    table = tabulate(data, headers, tablefmt="latex_longtable")

Example Output:

\begin{longtable}{ccc}

    \hline

    Name & Age & Occupation \\

    \hline

    \endhead

    Alice & 24 & Engineer \\

    Bob & 30 & Data Scientist \\

    Charlie & 27 & Designer \\

    \hline

    \end{longtable}

AsciiDoc ("pipe")    

This format generates a table using AsciiDoc’s pipe table syntax.

    table = tabulate(data, headers, tablefmt="pipe")

Example Output:

| Name    | Age | Occupation       |

    |---------|-----|------------------|

    | Alice   | 24  | Engineer         |

    | Bob     | 30  | Data Scientist  |

    | Charlie | 27  | Designer         |

Pretty Table ("pretty")

This format uses the PrettyTable library to create visually appealing ASCII tables.

    table = tabulate(data, headers, tablefmt="pretty")

Example Output:

+---------+-----+------------------+

    |  Name   | Age |   Occupation     |

    +---------+-----+------------------+

    | Alice   |  24 |    Engineer      |

    |  Bob    |  30 | Data Scientist  |

    | Charlie |  27 |    Designer      |

    +---------+-----+------------------+

Grid (Wide) ("grid wide")

This format is similar to the regular grid format but allows for wider column spacing.

    table = tabulate(data, headers, tablefmt="grid wide")

Example Output:

+---------+-----+------------------+

    | Name    | Age | Occupation       |

    +---------+-----+------------------+

    | Alice   | 24  | Engineer         |

    | Bob     | 30  | Data Scientist  |

    | Charlie | 27  | Designer         |

    +---------+-----+------------------+

Jira ("jira")

This format generates a table suitable for Jira markup language.

    table = tabulate(data, headers, tablefmt="jira")

Example Output:

|| Name || Age || Occupation ||

    | Alice | 24 | Engineer |

    | Bob | 30 | Data Scientist |

    | Charlie | 27 | Designer |

Plain Text (Pipe) (`”plain_pipe”`)

Similar to the pipe format, but uses plain text without any additional formatting.

    table = tabulate(data, headers, tablefmt="plain_pipe")

Example Output:

Name    | Age | Occupation

    Alice   | 24  | Engineer

    Bob     | 30  | Data Scientist

    Charlie | 27  | Designer

HTML (GitHub Flavored) ("html_github")

This format generates an HTML table with GitHub Flavored Markdown styling.

    table = tabulate(data, headers, tablefmt="html_github")

Example Output:

<table>

    <thead>

    <tr><th>Name</th><th>Age</th><th>Occupation</th></tr>

    </thead>

    <tbody>

    <tr><td>Alice</td><td>24</td><td>Engineer</td></tr>

    <tr><td>Bob</td><td>30</td><td>Data Scientist</td></tr>

    <tr><td>Charlie</td><td>27</td><td>Designer</td></tr>

    </tbody>

    </table>

Textile (`”textile”`)

This format generates a table using Textile markup language.

    table = tabulate(data, headers, tablefmt="textile")

Example Output:

|_. Name |_. Age |_. Occupation |

    | Alice | 24 | Engineer |

    | Bob | 30 | Data Scientist |

    | Charlie | 27 | Designer |

These additional formatting options offer compatibility with various markup languages and platforms. Depending on your specific use case, you can choose the format that integrates seamlessly with your preferred environment or documentation tool. Feel free to experiment with these options to find the one that best suits your needs.

Handling Different Data Types in Tabulate

One of the strengths of the Tabulate library is its ability to handle various data types seamlessly. Whether you are dealing with strings, numbers, or a combination of both, Tabulate intelligently formats and aligns the data to create a visually appealing table.

Strings

Strings are treated as straightforward text and are displayed as-is in the table.

Example:

data_strings = [["Alice", "Engineer"],

                     ["Bob", "Data Scientist"],

                     ["Charlie", "Designer"]]

     headers_strings = ["Name", "Occupation"]

     table_strings = tabulate(data_strings, headers_strings, tablefmt="grid")

     print(table_strings)

Output:

+---------+------------------+

     | Name    | Occupation       |

     +---------+------------------+

     | Alice   | Engineer         |

     | Bob     | Data Scientist  |

     | Charlie | Designer         |

     +---------+------------------+

Numbers

Numeric values are aligned to the right by default.

Example:

data_numbers = [[1, 123.45, 500],

                     [20, 456.78, 1000],

                     [300, 789.01, 1500]]

     headers_numbers = ["A", "B", "C"]

     table_numbers = tabulate(data_numbers, headers_numbers, tablefmt="grid")

     print(table_numbers)

Output:

+-----+--------+------+

     | A   |      B |    C |

     +-----+--------+------+

     |   1 | 123.45 |  500 |

     |  20 | 456.78 | 1000 |

     | 300 | 789.01 | 1500 |

     +-----+--------+------+

Alignment Options

You can customize the alignment of columns using the `colalign` parameter.

Example:

data_mixed_types = [["Alice", 24, "Engineer"],

                         ["Bob", 30, "Data Scientist"],

                         ["Charlie", 27, "Designer"]]

     headers_mixed_types = ["Name", "Age", "Occupation"]

     table_mixed_types = tabulate(data_mixed_types, headers_mixed_types, tablefmt="grid", colalign=("left", "center", "right"))

     print(table_mixed_types)

Output:

+---------+-----+------------------+

     | Name    | Age |       Occupation |

     +---------+-----+------------------+

     | Alice   |  24 |         Engineer |

     | Bob     |  30 | Data Scientist  |

     | Charlie |  27 |         Designer |

     +---------+-----+------------------+

By default, Tabulate automatically determines the data type of each element and aligns it accordingly. If needed, you can further customize the alignment to ensure your table is both visually appealing and easy to interpret.

Customizing Table Appearance in Tabulate

Tabulate offers a range of options for customizing the appearance of tables, allowing you to control column widths, alignment, and apply styles for enhanced visual appeal.

Customizing Column Widths

Example:

You can set custom column widths using the `colwidth` parameter.

data_custom_width = [["Alice", 24, "Engineer"],

                          ["Bob", 30, "Data Scientist"],

                          ["Charlie", 27, "Designer"]]

     headers_custom_width = ["Name", "Age", "Occupation"]

     table_custom_width = tabulate(data_custom_width, headers_custom_width, tablefmt="grid", colwidth=(10, 5, 15))

     print(table_custom_width)

Output:

+------------+-----+------------------+

     | Name       | Age | Occupation       |

     +------------+-----+------------------+

     | Alice      |  24 | Engineer         |

     | Bob        |  30 | Data Scientist  |

     | Charlie    |  27 | Designer         |

     +------------+-----+------------------+

Customizing Alignment

You can control the alignment of columns using the `colalign` parameter.

Example:

data_custom_alignment = [["Alice", 24, "Engineer"],

                              ["Bob", 30, "Data Scientist"],

                              ["Charlie", 27, "Designer"]]

     headers_custom_alignment = ["Name", "Age", "Occupation"]

     table_custom_alignment = tabulate(data_custom_alignment, headers_custom_alignment, tablefmt="grid", colalign=("left", "center", "right"))

     print(table_custom_alignment)

Output:

+---------+-----+------------------+

     | Name    | Age |       Occupation |

     +---------+-----+------------------+

     | Alice   |  24 |         Engineer |

     | Bob     |  30 | Data Scientist  |

     | Charlie |  27 |         Designer |

     +---------+-----+------------------+

Applying Styles

You can apply custom styles to the entire table or individual elements.

Example:

data_custom_style = [["Alice", 24, "Engineer"],

                          ["Bob", 30, "Data Scientist"],

                          ["Charlie", 27, "Designer"]]

     headers_custom_style = ["Name", "Age", "Occupation"]

     # Apply a style to the entire table

     style = "color:red"

     table_custom_style = tabulate(data_custom_style, headers_custom_style, tablefmt="grid", numalign="center", stralign="center", tablefmt="pipe", colalign=("center", "center", "center"), numformat=".2f", tablefmt="plain", tablestyles=[style])

     print(table_custom_style)

Output:

|   Name   | Age |   Occupation   |

     |:--------:|:---:|:---------------:|

     |  Alice   | 24  |    Engineer     |

     |   Bob    | 30  |Data Scientist  |

     | Charlie  | 27  |    Designer     |

These customization options give you the flexibility to design tables that suit your specific needs. Whether adjusting column widths, alignment, or applying styles for visual appeal, Tabulate provides the tools to create tables that are both informative and aesthetically pleasing.

Sorting and Filtering Data

Sorting Tables Based on Specific Columns

Tabulate allows you to easily sort tables based on specific columns. By using the `sort` parameter, you can specify the column by which the table should be sorted.

from tabulate import tabulate

# Sample data

data = [

    ["Alice", 24, "Engineer"],

    ["Bob", 30, "Data Scientist"],

    ["Charlie", 27, "Designer"],

]

headers = ["Name", "Age", "Occupation"]

# Sorting based on the "Age" column

sorted_table = tabulate(sorted(data, key=lambda x: x[1]), headers, tablefmt="grid")

print(sorted_table)

This example sorts the table based on the “Age” column in ascending order.

Filtering Rows Based on Conditions

Filtering rows in Tabulate can be achieved by applying conditions to the data before creating the table. Use list comprehensions or other filtering techniques to select the desired rows.

# Sample data

data = [

    ["Alice", 24, "Engineer"],

    ["Bob", 30, "Data Scientist"],

    ["Charlie", 27, "Designer"],

]

headers = ["Name", "Age", "Occupation"]

# Filtering rows where age is greater than 25

filtered_data = [row for row in data if row[1] > 25]

filtered_table = tabulate(filtered_data, headers, tablefmt="grid")

print(filtered_table)

This example filters the rows based on the condition that the age must be greater than 25.

Advanced Features

Merging Cells, Nested Tables, and More

Tabulate offers advanced features to enhance table presentation. You can merge cells using the `merge_cells` parameter, create nested tables, and even apply custom formatting to individual cells.

# Sample data

data = [

    ["Alice", 24, "Engineer"],

    ["Bob", 30, "Data Scientist"],

    ["Charlie", 27, "Designer"],

]

headers = ["Name", "Age", "Occupation"]

# Merging cells in the "Name" column

merged_table = tabulate(data, headers, tablefmt="grid", colalign=("center", "center", "left"), merge_cells=True)

print(merged_table)

This example merges cells in the “Name” column for a cleaner and more visually appealing table.

Examples of Complex Table Structures

Creating complex table structures is possible with Tabulate. You can use custom formatting, multiple alignments, and styles to achieve intricate designs.

# Sample data

data = [

    ["Alice", 24, "Engineer"],

    ["Bob", 30, "Data Scientist"],

    ["Charlie", 27, "Designer"],

]

headers = ["\u001b[31mName\u001b[0m", "\u001b[34mAge\u001b[0m", "\u001b[32mOccupation\u001b[0m"]

Applying custom styles to headers

complex_table = tabulate(data, headers, tablefmt="grid")

print(complex_table)

This example showcases a table with custom styles applied to headers, resulting in a more sophisticated appearance.

Practical Examples of Using Tabulate

  • Data Exploration: Tabulate is ideal for quick data exploration, providing a clear and organized view of datasets.
  • Command-Line Tools: Integrating Tabulate into command-line scripts simplifies displaying structured information to users.
  • Reports and Documentation: Generating tables for reports and documentation becomes straightforward with Tabulate’s diverse formatting options.

Real-World Scenarios

  • Database Query Results: Displaying results from database queries in a tabular format for easy interpretation.
  • Data Analysis and Visualization: Utilizing Tabulate to present summarized data during the analysis phase of a project.
  • Configuration Information: Structuring and displaying configuration information in a clear table format for system administrators.

Best Practices and Tips

Tips for Optimizing Performance

  • Reduce Cell Merging: Limit the use of cell merging for large datasets to improve rendering performance.
  • Use Efficient Data Structures: Opt for efficient data structures, such as NumPy arrays, for better performance.

Best Practices

  • Consistent Column Alignment: Maintain consistent alignment across columns for a polished and professional look.
  • Clear and Descriptive Headers: Craft clear and descriptive headers to enhance table readability.
  • Format Numbers Appropriately: Format numeric data appropriately using the numalign and floatfmt parameters.

Conclusion

In this comprehensive guide to mastering Tabulate, we explored various aspects of the Python library, from basic table creation to advanced customization and real-world use cases. Whether you’re sorting, filtering, or designing complex table structures, Tabulate proves to be a versatile tool for presenting structured data.

As you continue to explore Tabulate, experiment with its features, and apply the best practices and tips shared in this guide, you’ll discover the flexibility and power it offers for creating visually appealing and informative tables. Embrace Tabulate for your data presentation needs and unlock a world of possibilities in tabular representation.

Want to learn about more such cool python libraries? Enroll for our FREE Python course today!

Happy coding!

Also read: Top 10 Python Libraries for Data Analysis

Data Analyst with over 2 years of experience in leveraging data insights to drive informed decisions. Passionate about solving complex problems and exploring new trends in analytics. When not diving deep into data, I enjoy playing chess, singing, and writing shayari.

Login to continue reading and enjoy expert-curated content.

Free Courses

Generative AI - A Way of Life

Explore Generative AI for beginners: create text and images, use top AI tools, learn practical skills, and ethics.

Getting Started with Large Language Models

Master Large Language Models (LLMs) with this course, offering clear guidance in NLP and model training made simple.

Building LLM Applications using Prompt Engineering

This free course guides you on building LLM apps, mastering prompt engineering, and developing chatbots with enterprise data.

Improving Real World RAG Systems: Key Challenges & Practical Solutions

Explore practical solutions, advanced retrieval strategies, and agentic RAG systems to improve context, relevance, and accuracy in AI-driven applications.

Microsoft Excel: Formulas & Functions

Master MS Excel for data analysis with key formulas, functions, and LookUp tools in this comprehensive course.

Responses From Readers

Flagship Programs

GenAI Pinnacle Program| GenAI Pinnacle Plus Program| AI/ML BlackBelt Program| Agentic AI Pioneer Program

Free Courses

Generative AI| DeepSeek| OpenAI Agent SDK| LLM Applications using Prompt Engineering| DeepSeek from Scratch| Stability.AI| SSM & MAMBA| RAG Systems using LlamaIndex| Building LLMs for Code| Python| Microsoft Excel| Machine Learning| Deep Learning| Mastering Multimodal RAG| Introduction to Transformer Model| Bagging & Boosting| Loan Prediction| Time Series Forecasting| Tableau| Business Analytics| Vibe Coding in Windsurf| Model Deployment using FastAPI| Building Data Analyst AI Agent| Getting started with OpenAI o3-mini| Introduction to Transformers and Attention Mechanisms

Popular Categories

AI Agents| Generative AI| Prompt Engineering| Generative AI Application| News| Technical Guides| AI Tools| Interview Preparation| Research Papers| Success Stories| Quiz| Use Cases| Listicles

Generative AI Tools and Techniques

GANs| VAEs| Transformers| StyleGAN| Pix2Pix| Autoencoders| GPT| BERT| Word2Vec| LSTM| Attention Mechanisms| Diffusion Models| LLMs| SLMs| Encoder Decoder Models| Prompt Engineering| LangChain| LlamaIndex| RAG| Fine-tuning| LangChain AI Agent| Multimodal Models| RNNs| DCGAN| ProGAN| Text-to-Image Models| DDPM| Document Question Answering| Imagen| T5 (Text-to-Text Transfer Transformer)| Seq2seq Models| WaveNet| Attention Is All You Need (Transformer Architecture) | WindSurf| Cursor

Popular GenAI Models

Llama 4| Llama 3.1| GPT 4.5| GPT 4.1| GPT 4o| o3-mini| Sora| DeepSeek R1| DeepSeek V3| Janus Pro| Veo 2| Gemini 2.5 Pro| Gemini 2.0| Gemma 3| Claude Sonnet 3.7| Claude 3.5 Sonnet| Phi 4| Phi 3.5| Mistral Small 3.1| Mistral NeMo| Mistral-7b| Bedrock| Vertex AI| Qwen QwQ 32B| Qwen 2| Qwen 2.5 VL| Qwen Chat| Grok 3

AI Development Frameworks

n8n| LangChain| Agent SDK| A2A by Google| SmolAgents| LangGraph| CrewAI| Agno| LangFlow| AutoGen| LlamaIndex| Swarm| AutoGPT

Data Science Tools and Techniques

Python| R| SQL| Jupyter Notebooks| TensorFlow| Scikit-learn| PyTorch| Tableau| Apache Spark| Matplotlib| Seaborn| Pandas| Hadoop| Docker| Git| Keras| Apache Kafka| AWS| NLP| Random Forest| Computer Vision| Data Visualization| Data Exploration| Big Data| Common Machine Learning Algorithms| Machine Learning| Google Data Science Agent
👁 Av Logo White

Continue your learning for FREE

Forgot your password?
👁 Av Logo White

Enter OTP sent to

Edit

Wrong OTP.

Enter the OTP

Resend OTP

Resend OTP in 45s

👁 Popup Banner
👁 AI Popup Banner