Pandas df.loc() 関数
loc[]は、Pandasにおけるラベル(Label)ベースのインデックス方式であり、行ラベルと列ラベルを使ってデータを選択するために使用します。DataFrameのインデックスの中でも最も直感的でよく使われる方法の一つであり、必要なデータを正確に特定できます。
位置ベースのインデックス(例:iloc[])とは異なり、loc[]は、データ自体に設定されたインデックスラベルを使用します。つまり、データの位置が変わっても、ラベルが変わらなければ、正確に対象のデータを選択できるということです。
基本構文とパラメータ
loc[]はDataFrameのインデクサであり、角括弧[]を使用してアクセスします。角括弧内にはさまざまな形式のパラメータを渡すことができ、行、列、または特定のセルを選択するために使用します。
構文形式
# 选择单行(返回 Series) DataFrame.loc[行标签] # 选择多行(返回 DataFrame) DataFrame.loc[[行标签1, 行标签2, ...]] # 选择行和列 DataFrame.loc[行标签, 列标签] DataFrame.loc[行切片, 列切片] DataFrame.loc[行条件, 列条件]
パラメータの説明
| パラメータの位置 | パラメータの型 | 説明 |
|---|---|---|
| 最初のパラメータ(行) | ラベル、ラベルリスト、ラベルスライス、ブール配列 | 行の選択に使用します。単一のラベル、複数のラベル、スライス、条件式を指定できます。 |
| 2番目のパラメータ(列) | ラベル、ラベルリスト、ラベルスライス | オプションで、列の選択に使用します。構文は行の選択と同じです。 |
戻り値の説明
- 単一の要素: スカラー値(単一の値)を返します。
- 単一行: Seriesを返します。
- 複数行: DataFrameを返します。
- 行と列の組み合わせ: 選択結果に応じてSeriesまたはDataFrameを返します。
例
豊富な例を通して、loc[]の使い方を完全にマスターしましょう。
例1:基本の使い方 - デフォルトインデックスを使用
DataFrameがデフォルトの整数インデックスを使用する場合、loc[]の動作はiloc[]に似ていますが、位置ではなくラベルを使用します。
例
# サンプルDataFrameを作成
data = {
'name': ['Alice', 'Bob', 'Charlie', 'David', 'Eve'],
'age': [18, 19, 17, 18, 20],
'score': [85, 92, 78, 90, 88],
'grade': ['A', 'A', 'B', 'A', 'B']
}
df = pd.DataFrame(data)
print("元のDataFrame:")
print(df)
print()
# locで単一行を選択(インデックスラベルを使用)
print("0行目を選択:")
print(df.loc[0])
print()
# 複数の行を選択
print("1、3、4行目を選択:")
print(df.loc[[1, 3, 4]])
print()
# スライスで連続した行を選択(注:locのスライスは両端を含みます)
print("1行目から3行目を選択(両端を含む):")
print(df.loc[1:3])
実行結果:
原始 DataFrame:
name age score grade
0 Alice 18 85 A
1 Bob 19 92 A
2 Charlie 17 78 B
3 David 18 90 A
4 Eve 20 88 B
选择第 0 行:
name Alice
age 18
score 85
grade A
Name: 0, dtype: object
选择第 1、3、4 行:
name age score grade
1 Bob 19 92 A
3 David 18 90 A
4 Eve 20 88 B
选择第 1 行到第 3 行(包含两端):
name age score grade
1 Bob 19 92 A
2 Charlie 17 78 B
3 David 18 90 A
コードの解説:
- デフォルトでは、DataFrameのインデックスは整数の0、1、2、3、4です。
df.loc[0]インデックスラベルが0の行を選択し、Seriesを返します。df.loc[[1, 3, 4]]複数の特定のインデックスの行を選択します。- 重要:
loc[]のスライスは両端を含みます(Pythonのスライスとは異なります)、1:3インデックス1、2、3を含みます。
例2:カスタムインデックスを使用
loc[]の真の強力さは、カスタムインデックスラベルを使用できることにあります。これはiloc[]との根本的な違いです。
例
# カスタムインデックスを持つDataFrameを作成
data = {
'name': ['Alice', 'Bob', 'Charlie', 'David', 'Eve'],
'age': [18, 19, 17, 18, 20],
'score': [85, 92, 78, 90, 88],
'grade': ['A', 'A', 'B', 'A', 'B']
}
df = pd.DataFrame(data, index=['a', 'b', 'c', 'd', 'e'])
print("カスタムインデックスを持つDataFrame:")
print(df)
print()
# カスタムラベルで単一行を選択
print("インデックスが'b'の行を選択:")
print(df.loc['b'])
print()
# カスタムラベルでスライス
print("インデックス'b'から'd'の行を選択:")
print(df.loc['b':'d'])
print()
# 複数の連続しないインデックスを選択
print("インデックス'a'、'c'、'e'の行を選択:")
print(df.loc[['a', 'c', 'e']])
実行結果:
带自定义索引的 DataFrame:
name age score grade
a Alice 18 85 A
b Bob 19 92 A
c Charlie 17 78 B
d David 18 90 A
e Eve 20 88 B
选择索引为 'b' 的行:
name Bob
age 19
score 92
grade A
Name: b, dtype: object
选择索引 'b' 到 'd' 的行:
name age score grade
b Bob 19 92 A
c Charlie 17 78 B
d David 18 90 A
选择索引 'a', 'c', 'e' 的行:
name age score grade
a Alice 18 85 A
c Charlie 17 78 B
e Eve 20 88 B
コードの解説:
- カスタムインデックスでは、整数インデックスの代わりに文字列'a'、'b'、'c'、'd'、'e'を使用します。
loc[]これらのラベルを使用してデータを選択するのは、非常に直感的です。- スライス'b':'d'にはラベル'b'、'c'、'd'が含まれ、これも両端を含みます。
例3:特定の列を選択
loc[]行を選択できるだけでなく、列も同時に選択できます。
例
data = {
'name': ['Alice', 'Bob', 'Charlie', 'David', 'Eve'],
'age': [18, 19, 17, 18, 20],
'score': [85, 92, 78, 90, 88],
'grade': ['A', 'A', 'B', 'A', 'B']
}
df = pd.DataFrame(data, index=['a', 'b', 'c', 'd', 'e'])
# 特定の行の特定の列を選択
print("インデックス'b'のname列とscore列を選択:")
print(df.loc['b', ['name', 'score']])
print()
# 複数の行と列を選択
print("インデックス'a'、'c'のname列とage列を選択:")
print(df.loc[['a', 'c'], ['name', 'age']])
print()
# すべての行の特定の列を選択
print("すべての行のname列とgrade列:")
print(df.loc[:, ['name', 'grade']])
print()
# 行スライスと列スライスの組み合わせ
print("インデックス'b'から'd'のname列からscore列:")
print(df.loc['b':'d', 'name':'score'])
実行結果:
选择索引 'b' 的 name 和 score 列:
name Bob
score 92
Name: b, dtype: object
选择索引 'a', 'c' 的 name 和 age 列:
name age
a Alice 18
c Charlie 17
所有行的 name 和 grade 列:
name grade
a Alice A
b Bob A
c Charlie B
d David A
e Eve B
索引 'b' 到 'd' 的 name 到 score 列:
name age score
b Bob 19 92
c Charlie 17 78
d David 18 90
コードの解説:
df.loc['b', ['name', 'score']]特定の行の特定の列を選択し、Seriesを返します。df.loc[['a', 'c'], ['name', 'age']]複数の行と列を選択し、DataFrameを返します。df.loc[:, ['name', 'grade']]コロンはすべての行を選択することを意味します。df.loc['b':'d', 'name':'score']行と列のスライスを同時に使用します。
例4:ブール条件を使用した選択
loc[]ブール配列や条件式を使用したデータのフィルタリングに対応しており、これは非常に強力な機能です。
例
data = {
'name': ['Alice', 'Bob', 'Charlie', 'David', 'Eve'],
'age': [18, 19, 17, 18, 20],
'score': [85, 92, 78, 90, 88],
'grade': ['A', 'A', 'B', 'A', 'B']
}
df = pd.DataFrame(data)
# ブール条件でスコアが85より大きい行を選択
print("スコアが85より大きい学生:")
print(df.loc[df['score'] > 85])
print()
# 複合条件:スコアが85より大きく、年齢が19未満
print("スコアが85より大きく、年齢が19未満の学生:")
print(df.loc[(df['score'] > 85) & (df['age'] 85, ['name', 'score']])
実行結果:
分数大于 85 的学生:
name age score grade
1 Bob 19 92 A
3 David 18 90 A
4 Eve 20 88 B
分数大于 85 且年龄小于 19 的学生:
name age score grade
3 David 18 90 A
使用布尔数组选择的行:
name age score grade
0 Alice 18 85 A
2 Charlie 17 78 B
4 Eve 20 88 B
分数大于 85 的学生的 name 和 score:
name score
1 Bob 92
3 David 90
4 Eve 88
コードの解説:
df.loc[df['score'] > 85]ブール条件でフィルタリングし、条件を満たす行を返します。- 複合条件は丸括弧で囲む必要があり、
&(かつ)と|(または)で接続します。 - ブール配列(長さが行数と同じである必要があります)を直接渡して行を選択することもできます。
- 条件の後に列選択を続けることもでき、細かいデータのフィルタリングを実現できます。
注意事項
loc[]はラベルインデックスを使用し、スライスは両端を含みます(Pythonのネイティブスライスとは異なります)。- 存在しないラベルを渡すと、KeyErrorエラーが発生します。
- ブール条件では、複合条件は必ず丸括弧を使用し、
&と|ではなく、Pythonのandとor。 loc[]データの読み取りと修正はどちらも便利ですが、大規模データのシナリオではパフォーマンスに注意してください。
重要なヒント:
loc[]とiloc[]は2つの異なるインデクサであり、見た目は似ていますが、原理はまったく異なります:loc[]はラベルベース、iloc[]は位置ベースです。使用する際は、実際の状況に応じて適切なインデクサを選択してください。
まとめ
loc[]は、Pandasにおけるラベルベースのデータセレクタであり、直感的で柔軟なデータアクセス方法を提供します。行ラベルと列ラベルの組み合わせにより、必要なデータを正確に選択できます。
その主な利点は次のとおりです:カスタムインデックスを使用することでコードが読みやすくなる、両端を含むスライス構文をサポートする、ブール条件を組み合わせた複雑なフィルタリングができる。実際のデータ分析では、loc[]は日常的に最も頻繁に使用されるインデックス方式の一つです。
Pandas のよく使う関数