DataFrame.to_markdown(buf=None, mode='wt', index=True, storage_options=None, **kwargs)[source]#

Print DataFrame in Markdown-friendly format.

bufstr, Path or StringIO-like, optional, default None

Buffer to write to. If None, the output is returned as a string.

modestr, optional

Mode in which file is opened, “wt” by default.

indexbool, optional, default True

Add index (row) labels.

New in version 1.1.0.

storage_optionsdict, optional

Extra options that make sense for a particular storage connection, e.g. host, port, username, password, etc. For HTTP(S) URLs the key-value pairs are forwarded to urllib.request.Request as header options. For other URLs (e.g. starting with “s3://”, and “gcs://”) the key-value pairs are forwarded to Please see fsspec and urllib for more details, and for more examples on storage options refer here.

New in version 1.2.0.


These parameters will be passed to tabulate.


DataFrame in Markdown-friendly format.


Requires the tabulate package.


>>> df = pd.DataFrame(
...     data={"animal_1": ["elk", "pig"], "animal_2": ["dog", "quetzal"]}
... )
>>> print(df.to_markdown())
|    | animal_1   | animal_2   |
|  0 | elk        | dog        |
|  1 | pig        | quetzal    |

Output markdown with a tabulate option.

>>> print(df.to_markdown(tablefmt="grid"))
|    | animal_1   | animal_2   |
|  0 | elk        | dog        |
|  1 | pig        | quetzal    |