Django:「pandasの集計結果をTemplateでForループしたらIndexが消えた」を解消する方法
Django:「pandasの集計結果をTemplateでForループしたらIndexが消えた」を解消する方法
SQLから値を取り出してDataFrameにして集計してTemplateに送る。
Djangoでシステムを組んでいれば何度も行うことになる処理です。
この時つまづくポイントの一つにインデックスの取り出しがあります。
pandasの集計結果をTemplateでForループしたけどIndexが取り出せない
シンプルなFor in ループだとインデックスフィールド触れないんです。私も何回調べた事か...。
具体的な事例で確認
こんなデータで考えてみます。
print(df) # col1 # row1 10 # row2 20 # row3 30
シンプルなForループで書くと最初のカラムが消える
{% for val in df %}
{{val}}
{% endfor %}
# 結果 {{val}}
10
20
30
{{ val.col1 }}とか{{ val['col1'] }}とかついつい書いてしまいますが、どちらも取得できません。
val.col1 では一切の値なし。val['col1'] では【TemplateSyntaxError】が発生します。
Indexを取り出すためには変数を2つ用意する
{% for index,val in df.items %}
{{index}} / {{val}}
{% endfor %}
# 結果
row1 / 10
row2 / 20
row3 / 30
辞書型のkeyを取り出す時と同じように変数を2つ用意します。
この辞書型と同じ方式でDataFrame型のIndexの値も取り出すことができます。
せっかく集計しても『何の集計か』がわからないと意味ないですからね。
Templateでは labelと値で表示する事が多いのでPandasをそのまま渡した場合は多用するはずです。
まとめ
最初のころはわざわざLISTにしてTemplateへ渡してましたが、これを覚えればPandasのままでOKなので便利です。
Forループには2つの変数を使い方法以外に{% empty %}なんて項目を用意してリストの中身がない時の処理を描くこともできます。Forループ内にIf文書いて処理したりしてましたけど、こいつあれば不要みたい。


