PandasのDataFrameから特定の列(カラム)を取り出して分析したり、計算結果に基づいて列の値を更新したりする操作は、データ処理の基本中の基本です。
本記事では、ブラケット記法 [] およびドット記法 . を用いた列データの取得方法と、特定の要素へのアクセス、さらに列全体のデータを新しい値で上書き更新する方法について解説します。
目次
列データの取得と更新の基本
DataFrameの列にアクセスする方法は主に2つあります。
- ブラケット記法:
df["列名"]- 最も標準的な方法です。列名にスペースや記号が含まれていても使用できます。
- ドット記法:
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のインデックスと一致していれば、データの並び順を気にすることなく、正しい行に正しい値を代入できます。
