Python pandasのループ処理時に使えるちょいテク

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までに散歩をやる。カテゴリー:健康。優先度:可能なら


TOPページ