【Python】Pandas DataFrameで行データを取得・更新する(loc / iloc)

PandasのDataFrame操作において、列(カラム)データの取得と同様に頻繁に行われるのが「行(ロー)」ごとのデータ抽出です。特定のIDを持つレコードを取り出したり、データのn番目にアクセスしたりする際には、loc および iloc プロパティを使用します。

本記事では、これら2つのアクセサの違いと使い分け、および行データを更新する方法について解説します。

目次

locとilocの違い

Pandasで行データを指定する方法は大きく分けて2つあります。

  1. loc[“ラベル”]: インデックス名(行ラベル)を指定してアクセスする方法。
  2. iloc[整数]: 行番号(0から始まる整数)を指定してアクセスする方法。

実装サンプルコード

以下に、生徒のテスト成績を管理するDataFrameを作成し、特定の生徒のデータを取得・更新するコードを示します。

import pandas as pd

def manage_row_data():
    """
    locとilocを用いた行データの取得と更新を実演する関数
    """
    
    # 1. データの準備
    # 生徒名をインデックス、数学と英語の点数をカラムに持つDataFrame
    student_names = ["Alice", "Bob", "Charlie", "David", "Ellen"]
    exam_data = {
        "Math": [75, 82, 90, 68, 95],
        "English": [88, 79, 85, 92, 70]
    }
    
    # インデックスを名前で指定してDataFrameを作成
    df = pd.DataFrame(exam_data, index=student_names)
    
    print("--- 初期の成績データ ---")
    print(df)
    print("\n")


    # 2. locを使った行の取得(ラベル指定)
    print("=== locによる行取得(ラベル指定) ===")
    # "Charlie" の行データを取得
    # 戻り値はSeries型となります
    charlie_data = df.loc["Charlie"]
    
    print("--- Charlieのデータ ---")
    print(charlie_data)
    print(f"型: {type(charlie_data)}\n")


    # 3. ilocを使った行の取得(位置指定)
    print("=== ilocによる行取得(位置指定) ===")
    # 上から4番目(インデックス3)の行データを取得 -> David
    row_at_3 = df.iloc[3]
    
    print("--- 4番目のデータ (David) ---")
    print(row_at_3)
    
    # 取得したSeriesから、特定のカラムの値を取り出す
    # ドット記法やブラケット記法が使えます
    david_math = row_at_3.Math
    print(f">> Davidの数学の点数: {david_math}\n")


    # 4. 行データの更新
    print("=== 行データの更新 ===")
    
    # Aliceの点数を修正するための新しいSeriesを作成
    # インデックス(カラム名)をDataFrameと合わせる必要があります
    new_alice_scores = pd.Series([80, 95], index=["Math", "English"])
    
    # locを使ってAliceの行を丸ごと上書き
    df.loc["Alice"] = new_alice_scores
    
    print("--- 更新後のデータ (Aliceの点数が変化) ---")
    print(df)

if __name__ == "__main__":
    manage_row_data()

実行結果

--- 初期の成績データ ---
         Math  English
Alice      75       88
Bob        82       79
Charlie    90       85
David      68       92
Ellen      95       70


=== locによる行取得(ラベル指定) ===
--- Charlieのデータ ---
Math       90
English    85
Name: Charlie, dtype: int64
型: <class 'pandas.core.series.Series'>

=== ilocによる行取得(位置指定) ===
--- 4番目のデータ (David) ---
Math       68
English    92
Name: David, dtype: int64
>> Davidの数学の点数: 68

=== 行データの更新 ===
--- 更新後のデータ (Aliceの点数が変化) ---
         Math  English
Alice      80       95
Bob        82       79
Charlie    90       85
David      68       92
Ellen      95       70

解説

戻り値はSeries

lociloc で1行だけを取得した場合、戻り値は列名がインデックスとなった Series オブジェクトになります。そのため、row_data.ColumnName のようにして個別の値に簡単にアクセスできます。

行の更新

行を更新する際は、新しいデータの形(リストやSeries)がDataFrameの列構成と一致している必要があります。 df.loc["Label"] = [値1, 値2] のようにリストを直接代入することも可能ですが、pd.Series を使うとラベル(列名)の対応関係が明確になり、より安全に更新を行えます。

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

この記事を書いた人

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

目次