【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を正しく使い分けましょう。
スポンサーリンク