よちよちpython

独習 python/Qpython/Pydroid3/termux/Linux

【Pandas】dfをto_markdown()でmd形式のテーブルに変換する

pandas.DataFrameをmarkdownテーブルに変換する

Jupyterでデータフレームを表示させると表になる。これはhtmlのtableが生成されているためですが、Pandasのto_markdown()をデータフレーム・オブジェクトの後ろに付けると、markdown形式のテーブル文字列に変換することができる。

それによって何が飯ウマなのかは不明、個人的需要があるわけでもないが、確認のためやってみるテスト。



【作業環境】

  • Android
  • Termux
  • Python3.9
  • Jupyter Notebook
import numpy as np
import pandas as pd



例1

まずは小さいデータフレームを試します。

# Numpyで配列生成
na = np.arange(1, 10).reshape(3,3)
na
array([[1, 2, 3],
       [4, 5, 6],
       [7, 8, 9]])
# 配列をデータフレーム化
df = pd.DataFrame(na)
df
0 1 2
0 1 2 3
1 4 5 6
2 7 8 9

これをmarkdown形式のテーブルに変換します。

# markdownテーブル化
df.to_markdown()
---------------------------------------------------------------------------

ImportError                               Traceback (most recent call last)

/data/data/com.termux/files/usr/tmp/ipykernel_26080/1721597204.py in <module>
----> 1 df.to_markdown()


/data/data/com.termux/files/usr/lib/python3.9/site-packages/pandas/core/frame.py in to_markdown(self, buf, mode, index, storage_options, **kwargs)
   2337         kwargs.setdefault("tablefmt", "pipe")
   2338         kwargs.setdefault("showindex", index)
-> 2339         tabulate = import_optional_dependency("tabulate")
   2340         result = tabulate.tabulate(self, **kwargs)
   2341         if buf is None:


/data/data/com.termux/files/usr/lib/python3.9/site-packages/pandas/compat/_optional.py in import_optional_dependency(name, extra, raise_on_missing, on_version)
    107     except ImportError:
    108         if raise_on_missing:
--> 109             raise ImportError(msg) from None
    110         else:
    111             return None


ImportError: Missing optional dependency 'tabulate'.  Use pip or conda to install tabulate.

あっーッ、なんかインストールしろと怒られた。了解!

!pip install tabulate
Collecting tabulate
  Downloading tabulate-0.8.9-py3-none-any.whl (25 kB)
Installing collected packages: tabulate
Successfully installed tabulate-0.8.9

では、もう一度、データフレームをmarkdownのテーブルに変換する。

# markdownテーブル化
df.to_markdown()
'|    |   0 |   1 |   2 |\n|---:|----:|----:|----:|\n|  0 |   1 |   2 |   3 |\n|  1 |   4 |   5 |   6 |\n|  2 |   7 |   8 |   9 |'

markdown形式のテーブルが文字列で表示・出力されました。

例2

大きいデータフレームではどうなるでしょうか。通常なら途中が自動的に省略された表示になる。

# 配列生成とデータフレーム化
na2 = np.arange(1,1001).reshape(-1,4)
df2 = pd.DataFrame(na2)
df2
0 1 2 3
0 1 2 3 4
1 5 6 7 8
2 9 10 11 12
3 13 14 15 16
4 17 18 19 20
... ... ... ... ...
245 981 982 983 984
246 985 986 987 988
247 989 990 991 992
248 993 994 995 996
249 997 998 999 1000

250 rows × 4 columns

500行の途中は自動的に省略されている。

では、これをmarkdownテーブル化します。

# 500行のデータフレームをmarkdownテーブルに変換
#df2.to_markdown()

省略されずに全行がテーブルで出力された(為に、コメントアウト)



データサイズの違いを確認する

ついでに、

データフレームを、通常のhtmlテーブル化した場合、markdownテーブル化した場合、とではサイズはどのくらい違うか調べておきます。

上で作ったデータフレームの変数を再利用して確認します。
出力される数値の単位はバイトです。

import sys

# 3×3 のデータフレーム
print(sys.getsizeof(df))
print(sys.getsizeof(df.to_markdown()))
216
173
# 500×4 のデータフレーム
print(sys.getsizeof(df2))
print(sys.getsizeof(df2.to_markdown()))
8144
8364

そんなに違わない。大きいデータになるとmarkdownの方が重くなっている。



おわりに

文字列のmarkdownテーブルの使い途とは…

以上。