【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テーブルの使い途とは…
以上。