見出し画像

pandas DataFrame_ドット演算子とブラケットによるアクセスの違い #398

DataFrameを扱っていて、各レコードの要素を取り出す書き方が2つあり、違いが気になったので整理しておきます。

以下のデータフレームを扱うこととします。

import pandas as pd

# データの準備
data = {
    'name': ['Alice', 'Bob', 'Charlie'],
    'age': [25, 32, 22],
    'city': ['New York', 'Los Angeles', 'London']
}

# データフレームの作成
df = pd.DataFrame(data)

これを.iterrow()関数を使ってfor文で回すことで、各レコードのインデックスと行のデータを含むタプルを返します

for index, row in df.iterrows():
    各rowの処理を記載

このrowの持つ要素を取り出す方法が2通りあります。


ドット演算子を使用した「属性アクセス」

以下のようにドット演算子を使う方法です。

for index, row in df.iterrows():
    print(row.name)
    print(row.age)
    print(row.city)

この方法は通常、Pythonのオブジェクト(クラスのインスタンスなど)のメソッドや属性にアクセスするために使います。

ただし、pandasのDataFrameにおいては、列の名前が有効なPythonの識別子である場合(つまり、スペースやハイフン、数字で始まるなどの無効な文字が含まれていない場合)、列に対して属性としてアクセスすることができます。


ブラケットを使用した「アイテムアクセス」

以下のようにブラケットを使用する方法です。

for index, row in df.iterrows():
    print(row['name'])
    print(row['age'])
    print(row['city'])

この方法では、pandasのDataFrameでは列の名前をキーとして列にアクセスします。Pythonのリストや辞書でインデックスやキーにより要素にアクセスするのと同様です。


2つの方法の違い

ドット演算子による属性アクセスの方が、DataFrameで使う場合には注意が必要です。

ドット演算子による属性アクセスは、列名が有効なPythonの識別子である場合のみ可能

列名にスペースやハイフンなどが含まれている場合、または数字で始まっている場合などはドット演算子でアクセスできません。一方、ブラケットによるアイテムアクセスはこれらの制限を受けません。

ドット演算子による属性アクセスは、列名がDataFrameの既存のメソッドや属性と衝突する場合に問題を起こす可能性あり

例えば、DataFrameに「mean」という名前の列がある場合、「df.mean」はその列にアクセスするのか、それともDataFrameのmean()メソッドを参照しているのか不明確になります。一方、ブラケットによるアイテムアクセスはこの問題を回避可能です。


以上の違いから、pandasのDataFrameの列にアクセスする際は、通常、ブラケットによるアイテムアクセス(df['name']など)が推奨されます。

ここまでお読みいただきありがとうございました!

この記事が気に入ったらサポートをしてみませんか?