以前の リストの記事 や、 matplotlibの記事 など、これまで多くの機能を学習してきました。今回は、これまでの知識を総動員してデータの見せ方を実践する総復習回です。

f文字列の基本と応用

Pythonでf文字列を使うには、文字列クォーテーション("')のすぐ前にアルファベットのfまたはFを置きます。そして、文字列の中に波括弧{}を書き、その中に変数名や計算式を記述します。さらに、波括弧の中でコロン:を使うことで、表示されるデータの見栄え(フォーマット)を細かく指定することができます。

f"文字列 {変数名や計算式:書式} 文字列"

の形式で記述します。

具体的には次のような処理が行われます。

  • データの取り出しと計算: まず、先頭にfが置かれている文字列をPythonが読み込むと、その文字列の中にある波括弧{}を探します。見つけた{}の中に書かれている変数の中身を取り出したり、計算式を実行したりします。
  • 書式の適用(フォーマット): 次に、右側に指定された書式のルールに従って、そのデータを指定された形に変換(フォーマット)します。
  • 文字列の完成: 最後に、変換された結果を文字として当てはめ(置き換え)てから、全体の文字列を完成させて処理を進めます。

よく使われる3つの書式指定を紹介します。

  • ゼロ埋め(:05): 桁数が少ないときに「00015」のように左側をゼロで埋めて桁を合わせます。コロンの後に05のように指定すると、全体の桁数が5桁に統一され、リストなどで並べた際の見栄えを綺麗に揃えることができます。
  • カンマ区切り(:,): 金額や大きな数値を扱う際、コロンの後に, を指定することで、「1,000,000」のように3桁ごとにカンマを入れて読みやすくすることができます。
  • 小数点の桁数指定(:.2f): 割り算などをした際、小数点以下の数字が長く続いて見栄えが悪くなることを防ぎます。.2f は「小数点第2位まで表示する」という指示になり、自動的に四捨五入されて綺麗な桁数に整えられます。

では、実際にやってみましょう。
Google Colaboratory (Colab) を開いて新しいノートブックを作成し、これまで学んだ機能をすべて使いながら、未整理のデータを綺麗に整えて出力するプログラムを書いてみます。

# 未整理の価格データ(一部重複あり、価格未定の0円のデータが含まれている)
raw_prices = [1500, 80, 0, 12500, 80, 300]

# set(集合)を使って重複したデータを排除し、リストに戻す
unique_prices = list(set(raw_prices))

# 内包表記を使って、0円(価格未定)を除外しつつ、消費税(10%)を足したリストを作る
tax_included = [price * 1.1 for price in unique_prices if price > 0]

# lambda式を使って、金額が安い順に並び替える
tax_included.sort(key=lambda x: x)

print("--- 商品リスト ---")

# enumerate関数で番号と価格を順番(1から開始)に取り出す
for i, price in enumerate(tax_included, start=1):
  # もし価格が100円未満なら、除外する
  if price < 100:
    continue

  # f文字列を使って、計算結果の埋め込み、ゼロ埋め、カンマ区切り、小数第2位を指定する
  print(f"商品番号{i:03}: 税込 {price:,.2f}円 (税抜き {price / 1.1:,.0f}円)")

とセルに入力して実行してみましょう。すると結果は

— 商品リスト —
商品番号002: 税込 330.00円 (税抜き 300円)
商品番号003: 税込 1,650.00円 (税抜き 1,500円)
商品番号004: 税込 13,750.00円 (税抜き 12,500円)

のように表示されます。

プログラムの解説(テキスト出力の総復習)

  • setによる重複排除(5行目): 未整理の価格データの中に同じ「80」が2つありましたが、setに変換することで重複が排除され、再びlist()でリストに戻しています。
  • 内包表記による抽出と計算(8行目): if price > 0 で価格未定である0円のデータを取り除きつつ、取り出した価格に1.1を掛けて税込価格の新しいリストを一行で作っています。
  • lambda式での並び替え(11行目): sort メソッドの基準(key)に lambda を渡し、金額の安い順に商品リストを並び替えています。
  • enumerateとcontinue(16~19行目): enumerate で1から始まる番号(i)を取得しています。ループの中で price < 100 (税込88円のデータ)に該当した時は、continue によってその回の処理がスキップされるため、「商品番号001」の表示は飛ばされています。
  • f文字列の実行(22行目): print 関数の中でフォーマットを指定しています。{i:03} によって番号が3桁でゼロ埋めされ、{price:,.2f}によって税込価格がカンマ付きの小数点第2位まで表示されています。さらに{price / 1.1:,.0f} のように、波括弧の中で直接割り算の計算を実行しつつ、小数点以下をなくす(0f)フォーマットも同時に適用しています。

f文字列を利用しグラフを描く

matplotlibで作成するグラフのタイトルや、グラフ上に直接文字を書き込む際にも、先ほどのf文字列を使うことができます。

プログラムの中で、新しくsum()関数という機能を使います。sum()関数は、括弧の中に指定したリストに含まれる数値をすべて足し合わせて、合計を計算してくれる機能です。total = sum(リスト) のように記述するだけで、自分でループを回して順番に足していくような処理を書かなくても、一行で合計値を取得することができます。

では、実際にやってみましょう。
Colabの新しいセルに、 zip関数 など最近学んだ機能を使いながら、棒グラフを作成するプログラムを書いてみます。

import matplotlib.pyplot as plt

# X軸のカテゴリとY軸の売り上げデータ(リスト)を用意する
items = ["Item A", "Item B", "Item C", "Item D"]
sales = [1500000, 850000, 2400000, 600000]

# 棒グラフを描画する
plt.bar(items, sales)

# sum関数を使って、リストの数値を全て合計して総売上を計算する
total_sales = sum(sales)

# グラフのタイトルにf文字列を使い、総売上をカンマ区切りで表示する
plt.title(f"Total Sales: {total_sales:,} JPY")

# zip関数を使って、グラフの棒の上に具体的な数値をカンマ区切りで書き込む
for item, sale in zip(items, sales):
  plt.text(item, sale, f"{sale:,}", ha='center', va='bottom')

# グラフを画面に描画
plt.show()

とセルに入力して実行してみましょう。すると結果は

f文字列を利用した棒グラフ

のように表示されます。

プログラムの解説(グラフの描画)

  • データの準備(4~5行目): X軸となる文字列のリストと、Y軸となる大きな数値のリストを用意しています。
  • 棒グラフの作成(8行目): plt.bar() で基本的な棒グラフを描画します。
  • タイトルの設定(11~14行目): sum() 関数でリストの合計値を計算し、plt.title() の中でf文字列を使い、 {total_sales:,}と指定することで、タイトルにカンマ付きの分かりやすい総売上を表示しています。
  • グラフ上に数値を書き込む(17~18行目): zip関数を使って、項目名と売上のデータをペアで取り出します。そしてplt.text()の中で再びf文字列{sale:,}を使い、それぞれの棒グラフの真上(ha='center', va='bottom' は文字の位置調整の命令です)に、カンマ区切りで具体的な数値を書き込んでいます。

[補足]グラフの左上の「1e6」という表示について

グラフを表示したとき、左上に「1e6」という文字が表示されています。これは数学やプログラミングでよく使われる「指数表記」というもので、「1×10の6乗」、つまり「1,000,000(100万)」を表しています。

グラフのY軸の目盛りを見ると、「0.5、1.0、1.5…」とならんでいますが、これに「1e6(100万)」を掛けた数字が実際の値になります。例えば、一番左の「Item A」の棒は目盛りの「1.5」のところにありますが、これは「1.5 × 100万=1,500,000」という意味になります。

matplotlibは、扱う数値の桁数が大きすぎると、Y軸の数字が長くなって画面からはみ出したり見栄えが悪くなるのを防ぐために、自動的にこのような省略表記にしてくれる機能を持っています。

省略表記を解除したい場合

もし、「1e6」という表記を使わずに、Y軸も普通の数字のまま(例:1500000)で表示させたい場合は、グラフを描画するプログラムのplt.show()の前に、以下の一行を追加することで解除できます。

# Y軸(axis='y')の省略表記を無効化(style='plain')する
plt.ticklabel_format(style='plain', axis='y')

まとめ

今回は、これまでの学習の総復習と、f文字列について解説しました。

  • f文字列: f"文字列 {変数名や計算式:書式}文字列" の形式で記述する。
  • 主な書式: :05 (ゼロ埋め)、:,(カンマ区切り)、:.2f(小数点以下の桁数)。

これまで学んだ変数の扱いや繰り返し処理、そして今回のf文字列をぜひ自身のプログラムで試してみてください。

open-in-colab

今回はこれで終了です。
今回のサンプルを用意したので、もし必要な場合は上の「Open in Colab」と書いてあるボタンをクリックしてください。なおそのままだと編集不可なので編集をしたい場合は「ドライブにコピー」をクリックしてコピーしてください。
なおGoogle ColaboratoryについてわからなかったらGoogleColaboratoryを使ってみよう_導入編をご覧ください。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA