非IT企業に勤める中年サラリーマンのIT日記

非IT企業でしかもITとは全く関係ない部署にいる中年エンジニア。唯一の趣味がプログラミングという”自称”プログラマー。

【Python】Pandasのlocとilocで異なる範囲指定に注意

   

Pandasを使ってデータを操作しているとき、locとilocの違いに戸惑うことがあります。その中でも特に注意が必要なのが、範囲指定の動作です。本記事では、locとilocがどのように動作するのか、実際のプログラム例を交えて説明します。

locとilocの基本的な違い

  • loc: ラベル(行名や列名)を使ってデータを選択します。範囲指定の場合は終了点を含む
  • iloc: インデックス番号(0から始まる整数)を使ってデータを選択します。範囲指定の場合は終了点を含まない

この違いが、例えばloc[0:100]とiloc[0:100]で異なる範囲を選択する原因となります。

 

プログラム例

以下に簡単なプログラム例を示します。

import pandas as pd
import numpy as np

# データフレームを作成
data = pd.DataFrame(
    np.arange(200).reshape(100, 2),  # 100行2列のデータ
    columns=['A', 'B']               # 列名をAとBに設定
)

# locで範囲を指定して取得
loc_result = data.loc[0:10]

# ilocで範囲を指定して取得
iloc_result = data.iloc[0:10]

print("locで取得した行数:", len(loc_result))
print("ilocで取得した行数:", len(iloc_result))
 

 

実行結果

上記のプログラムを実行すると、以下のような結果になります。

locで取得した行数: 11
ilocで取得した行数: 10
 

 

locでは終了点(この場合は10行目)が含まれるため、合計11行が取得されます。一方、ilocでは終了点を含まないため、10行のみ取得されます。

 

注意点

この違いを理解していないと、以下のようなミスにつながる可能性があります。

  • 範囲指定した結果のサイズが想定と異なる。
  • データ加工中に余計なデータが含まれてしまう。

例えば、100行のデータを10行ずつ分割したい場合に、locを使うと範囲が重複してしまいます。

# locで分割(間違った例)
groups = [data.loc[i:i+9] for i in range(0, 100, 10)]
print("グループの数:", len(groups))
print("最後のグループの行数:", len(groups[-1]))  # 重複して11行になる

# ilocで分割(正しい例)
groups = [data.iloc[i:i+10] for i in range(0, 100, 10)]
print("グループの数:", len(groups))
print("最後のグループの行数:", len(groups[-1]))  # 正しく10行になる
 

 

まとめ

locとilocの範囲指定の動作は、終了点を含むか含まないかという点で異なります。この違いをしっかり理解しておくことで、データ操作時のミスを防ぐことができます。目的に応じてlocとilocを正しく使い分けましょう。

 

スポンサーリンク

 - Python