pandasのdf.valuesのループ処理中に使えるちょいテクの紹介です。
例として以下のようなtodo listデータフレームを用意しました。
# test.py
import pandas as pd
cols = ['title', 'category', 'due']
items = [['家の掃除', '家事', '2021-08-28'],
['散歩', '健康', '2021-08-29']]
df = pd.DataFrame(items, columns=cols)
print(df)
>>>
title category due
0 家の掃除 家事 2021-08-28
1 散歩 健康 2021-08-29
ループ処理で値を取り出す際はこんな感じになると思います。
# test.py
for v in df.values:
title = v[0]
category = v[1]
due = v[2]
print(f'{due}までに{title}をやる。カテゴリー:{category}')
>>>
2021-08-28までに家の掃除をやる。カテゴリー:家事
2021-08-29までに散歩をやる。カテゴリー:健康
このくらいカラム数が少なければ問題ないのですがv[0]
のようにアクセスしていると、カラム数が多くなった際に見栄えが悪くなってきます。
なので、先にカラム名とindexをキーバリュー形式にした、辞書を作成しておくと良いとおもいます。
# test.py
import pandas as pd
cols = ['title', 'category', 'due']
items = [['家の掃除', '家事', '2021-08-28'],
['散歩', '健康', '2021-08-29']]
df = pd.DataFrame(items, columns=cols)
col_dict = {col: i for i, col in enumerate(df.columns.values)}
print(col_dict)
>>>
{'title': 0, 'category': 1, 'due': 2}
ループ処理中にカラム名を指定してアクセスできるようになります。
# test.py
for v in df.values:
title = v[col_dict['title']]
category = v[col_dict['category']]
due = v[col_dict['due']]
print(f'{due}までに{title}をやる。カテゴリー:{category}')
>>>
2021-08-28までに家の掃除をやる。カテゴリー:家事
2021-08-29までに散歩をやる。カテゴリー:健康
このようにしておくと、例えば途中にカラムが追加になっても対応がしやすいです。
# test.py
import pandas as pd
# 後から優先度も間に追加したくなった
cols = ['title', 'category', 'priority', 'due']
items = [['家の掃除', '家事', '最優先', '2021-08-28'],
['散歩', '健康', '可能なら', '2021-08-29']]
df = pd.DataFrame(items, columns=cols)
col_dict = {col: i for i, col in enumerate(df.columns.values)}
for v in df.values:
title = v[col_dict['title']]
category = v[col_dict['category']]
due = v[col_dict['due']]
priority = v[col_dict['priority']]
print(f'{due}までに{title}をやる。カテゴリー:{category}。優先度:{priority}')
>>>
2021-08-28までに家の掃除をやる。カテゴリー:家事。優先度:最優先
2021-08-29までに散歩をやる。カテゴリー:健康。優先度:可能なら