【Python】Pandas DataFrameの列データ取得と更新(ブラケット・ドット記法)

PandasのDataFrameから特定の列(カラム)を取り出して分析したり、計算結果に基づいて列の値を更新したりする操作は、データ処理の基本中の基本です。

本記事では、ブラケット記法 [] およびドット記法 . を用いた列データの取得方法と、特定の要素へのアクセス、さらに列全体のデータを新しい値で上書き更新する方法について解説します。

目次

列データの取得と更新の基本

DataFrameの列にアクセスする方法は主に2つあります。

  1. ブラケット記法: df["列名"]
    • 最も標準的な方法です。列名にスペースや記号が含まれていても使用できます。
  2. ドット記法: df.列名
    • 列名がPythonの変数名のルール(スペースなし、数字で始まらない等)を満たしている場合に使用できる、簡潔な書き方です。

また、抽出したSeriesに対して新しいリストやSeriesを代入することで、その列のデータを一括で更新することができます。

実装サンプルコード

以下に、果物屋の在庫リストを題材としたコードを示します。価格(Price)と在庫数(Stock)を持つDataFrameを操作します。

import pandas as pd

def manage_column_data():
    """
    DataFrameの列アクセス、要素参照、列データの更新を実演する関数
    """
    
    # 1. データの準備
    # 果物名をインデックス、価格と在庫をカラムに持つDataFrameを作成
    fruit_names = ["Apple", "Banana", "Orange", "Grape", "Peach"]
    inventory_data = {
        "Price": [150, 100, 120, 400, 300],
        "Stock": [50, 80, 60, 20, 15]
    }
    
    df = pd.DataFrame(inventory_data, index=fruit_names)
    
    print("--- 初期DataFrame ---")
    print(df)
    print("\n")


    # 2. 列データの取得
    print("=== 列データの取得 ===")
    
    # パターンA: ブラケット記法 (推奨)
    # Seriesとして取得されます
    price_series = df["Price"]
    print("--- Price列 (ブラケット記法) ---")
    print(price_series)
    
    # パターンB: ドット記法
    # コードが短くなりますが、列名によっては使えない場合があります
    stock_series = df.Stock
    print("\n--- Stock列 (ドット記法) ---")
    print(stock_series)


    # 3. 特定の要素(セル)へのアクセス
    print("\n=== 特定の要素へのアクセス ===")
    
    # Stock列の "Banana" の値を取得
    # Series(df.Stock) に対して、インデックス(.Banana) でアクセス
    banana_stock = df.Stock.Banana
    print(f"バナナの在庫数: {banana_stock}")


    # 4. 列データの更新(上書き)
    print("\n=== 列データの更新 ===")
    
    # 新しい価格リストで 'Price' 列を更新
    # リストの長さはDataFrameの行数と一致している必要があります
    new_prices = [160, 110, 130, 420, 320]
    
    # Pandas Seriesとして作成し、インデックスを明示して代入することも可能
    # インデックスを合わせることで、順序が異なっても正しくマッピングされます
    new_price_series = pd.Series(new_prices, index=fruit_names)
    
    df["Price"] = new_price_series
    
    print("--- 価格改定後のDataFrame ---")
    print(df)

if __name__ == "__main__":
    manage_column_data()

実行結果

--- 初期DataFrame ---
        Price  Stock
Apple     150     50
Banana    100     80
Orange    120     60
Grape     400     20
Peach     300     15


=== 列データの取得 ===
--- Price列 (ブラケット記法) ---
Apple     150
Banana    100
Orange    120
Grape     400
Peach     300
Name: Price, dtype: int64

--- Stock列 (ドット記法) ---
Apple     50
Banana    80
Orange    60
Grape     20
Peach     15
Name: Stock, dtype: int64

=== 特定の要素へのアクセス ===
バナナの在庫数: 80

=== 列データの更新 ===
--- 価格改定後のDataFrame ---
        Price  Stock
Apple     160     50
Banana    110     80
Orange    130     60
Grape     420     20
Peach     320     15

解説と注意点

ブラケット記法 vs ドット記法

ドット記法(df.Price)は手軽ですが、以下のようなケースではブラケット記法(df["Price"])が必須となります。

  • 列名にスペースが含まれる場合(例: "Unit Price"
  • 列名がPythonの予約語やメソッド名と同じ場合(例: "class", "sum", "count"
  • 変数を使って動的に列名を指定する場合(例: col = "Price"; df[col]

Seriesによる更新のメリット

列を更新する際、単なるリスト(配列)を代入することも可能ですが、pd.Series を代入する方法にはインデックスによる自動調整というメリットがあります。 SeriesのインデックスがDataFrameのインデックスと一致していれば、データの並び順を気にすることなく、正しい行に正しい値を代入できます。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

私が勉強したこと、実践したこと、してることを書いているブログです。
主に資産運用について書いていたのですが、
最近はプログラミングに興味があるので、今はそればっかりです。

目次