PandasのDataFrame操作において、列(カラム)データの取得と同様に頻繁に行われるのが「行(ロー)」ごとのデータ抽出です。特定のIDを持つレコードを取り出したり、データのn番目にアクセスしたりする際には、loc および iloc プロパティを使用します。
本記事では、これら2つのアクセサの違いと使い分け、および行データを更新する方法について解説します。
目次
locとilocの違い
Pandasで行データを指定する方法は大きく分けて2つあります。
- loc[“ラベル”]: インデックス名(行ラベル)を指定してアクセスする方法。
- 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
loc や iloc で1行だけを取得した場合、戻り値は列名がインデックスとなった Series オブジェクトになります。そのため、row_data.ColumnName のようにして個別の値に簡単にアクセスできます。
行の更新
行を更新する際は、新しいデータの形(リストやSeries)がDataFrameの列構成と一致している必要があります。 df.loc["Label"] = [値1, 値2] のようにリストを直接代入することも可能ですが、pd.Series を使うとラベル(列名)の対応関係が明確になり、より安全に更新を行えます。
