Pythonのデータ分析ライブラリであるpandasには、行・列のラベルに基づいてデータを選択・操作するためのlocという機能があります。このlocという名前は、location-based indexerの略語です。
locの機能
locは、行・列のラベルに基づいてデータを選択・操作するための機能です。たとえば、次のようなDataFrameがあるとします。
import pandas as pd import numpy as np df = pd.DataFrame({'A': np.random.rand(5), 'B': np.random.rand(5), 'C': np.random.rand(5)}, index=['a', 'b', 'c', 'd', 'e']) print(df)
A B C a 0.037679 0.245722 0.554390 b 0.731613 0.134751 0.263329 c 0.872822 0.722677 0.606783 d 0.496102 0.965236 0.413774 e 0.523986 0.317638 0.398561
このDataFrameの場合、行には’a’, ‘b’, ‘c’, ‘d’, ‘e’というラベルが付いています。locを使うと、これらのラベルを指定して、特定の行・列を選択することができます。たとえば、次のように書くことで、行bと列Bの値を取得できます。
print(df.loc['b', 'B'])
0.13475102921892128
また、行・列のラベルを指定せずにlocを使うと、全体を選択することができます。
print(df.loc[:, 'B'])
a 0.245722 b 0.134751 c 0.722677 d 0.965236 e 0.317638 Name: B, dtype: float64
このように、locはDataFrameの行・列にラベルが付いている場合に非常に便利です。
ilocとの違い
pandasには、行・列の整数インデックスに基づいてデータを選択・操作するためのilocという機能もあります。locとの違いは、行・列のラベルに基づくアクセスか、整数インデックスに基づくアクセスかという点です。
たとえば、次のようなDataFrameがあるとします。
df = pd.DataFrame({'A': [1, 2, 3, 4, 5], 'B': [6, 7, 8, 9, 10], 'C': [11, 12, 13, 14, 15]}) print(df)
A B C 0 1 6 11 1 2 7 12 2 3 8 13 3 4 9 14 4 5 10 15
この場合、行・列にラベルが付いていないため、ilocを使って値を選択する必要があります。たとえば、次のように書くことで、行2と列1の値を取得できます。
print(df.iloc[2, 1])
8
このように、locとilocはそれぞれ違う用途に使われます。行・列にラベルが付いている場合はlocを、付いていない場合はilocを使うと良いでしょう。
locの使い方
基本的なlocの使い方を見ていきましょう。
まず、行・列のラベルを指定して、特定の行・列を選択する方法を見ていきます。次のようなDataFrameを考えます。
df = pd.DataFrame({'A': [1, 2, 3, 4, 5], 'B': [6, 7, 8, 9, 10], 'C': [11, 12, 13, 14, 15]}, index=['a', 'b', 'c', 'd', 'e']) print(df)
A B C a 1 6 11 b 2 7 12 c 3 8 13 d 4 9 14 e 5 10 15
このDataFrameの場合、行には’a’, ‘b’, ‘c’, ‘d’, ‘e’というラベルが付いています。たとえば、次のように書くことで、行bと列Bの値を取得できます。
print(df.loc['b', 'B'])
7
行・列のラベルを指定せずにlocを使うと、全体を選択することができます。
print(df.loc[:, ' B'])
a 6 b 7 c 8 d 9 e 10 Name: B, dtype: int64
また、行を指定して、その行のすべての列を選択することもできます。
print(df.loc['b', :])
A 2 B 7 C 12 Name: b, dtype: int64
さらに、行・列のラベルをリストで指定して、特定の行・列を選択することもできます。
print(df.loc[['a', 'b'], ['B', 'C']])
B C a 6 11 b 7 12
このように、locは行・列のラベルを指定して、柔軟にデータを選択・操作することができます。
応用的な使い方
locを使うと、複雑な条件でのデータの抽出・操作も可能です。
たとえば、次のようなDataFrameがあるとします。
df = pd.DataFrame({'A': ['foo', 'bar', 'foo', 'bar', 'foo', 'bar', 'foo', 'foo'], 'B': ['one', 'one', 'two', 'three', 'two', 'two', 'one', 'three'], 'C': np.random.randn(8), 'D': np.random.randn(8)}) print(df)
A B C D 0 foo one 0.598235 1.206421 1 bar one 0.348689 0.447935 2 foo two -0.712593 -1.443625 3 bar three -0.058105 0.451837 4 foo two -0.352787 -1.335089 5 bar two -0.763819 -0.332059 6 foo one 1.711455 0.076986 7 foo three 0.003878 -0.129292
このDataFrameから、列Aが’foo’であり、列Bが’one’または’three’である行を選択するには、次のように書くことができます。
print(df.loc[(df['A'] == 'foo') & ((df['B'] == 'one') | (df['B'] == 'three'))])
A B C D 0 foo one 1.170760 1.286219 6 foo one 2.515714 1.402703 7 foo three 0.680573 -0.324687
このように、locを使うと、複雑な条件でのデータの選択・操作が可能になります。
まとめ
pandasのlocは、行・列のラベルに基づいてデータを選択・操作するための機能であり、location-based indexerの略語です。locを使うことで、行・列にラベルが付いている場合に非常に便利にデータを選択・操作することができます。また、複雑な条件でのデータの選択・操作も可能です。
ilocとの違いについても理解しておくと良いでしょう。行・列にラベルが付いている場合はlocを、付いていない場合はilocを使うと良いです。
以上が、pandasのlocについての説明でした。