loc
loc
を使って複数行・複数列の範囲を指定する際、「行名のリスト」「列名のリスト」に書いた順番に従って行・列が取得できます。また、同じ行名・列名を複数回書いた場合、同じ行・列が重複して取得できます。
Name | Age | |
---|---|---|
10 | Alice | 17 |
20 | Bob | 24 |
30 | Carol | 29 |
行名のリストとして[20, 10]
を指定することで、最初に行名が20
の行が、次に行名が10
の行が取得できます。
df.loc[[20, 10]]
Name | Age | |
---|---|---|
20 | Bob | 24 |
10 | Alice | 17 |
また、[20, 20]
を指定することで、行名が20
の行を重複して取得できます。
df.loc[[20, 20]]
Name | Age | |
---|---|---|
20 | Bob | 24 |
20 | Bob | 24 |
同様に、列名のリストとして["Age", "Name"]
を指定すると、列Age
、列Name
の順に取得できます。
df.loc[:, ["Age", "Name"]]
Age | Name | |
---|---|---|
10 | 17 | Alice |
20 | 24 | Bob |
30 | 29 | Carol |
df.loc[0:4, ['home_score', 'away_score']]
home_score | away_score | |
---|---|---|
0 | 0 | 0 |
1 | 4 | 2 |
2 | 2 | 1 |
3 | 2 | 2 |
4 | 3 | 0 |
- locで行を指定する際、スライスの[n1:n2]はn1以上,n2以下という指定になる
- 一般的なスライスはn1以上,n2未満
ilocの場合
loc
と同様に、iloc
でも「行番号のリスト」「列番号のリスト」で書いた行番号・列番号の順番に従って取得されます。また、同じ行番号・列番号を複数回書くと同じ行・列が重複して取得できます。
df.iloc[行番号または行番号のリスト, 列番号または列番号のリスト]
import pandas as pd
df = pd.DataFrame(
[["Alice", 17], ["Bob", 24], ["Carol", 29]],
index=[10, 20, 30],
columns=["Name", "Age"],
)
df
Name | Age | |
---|---|---|
10 | Alice | 17 |
20 | Bob | 24 |
30 | Carol | 29 |
print(df.loc[[30, 20], ["Age", "Name"]])
print("----")
print(df.iloc[[2,1],[1,0]])
Age Name 30 29 Carol 20 24 Bob ---- Age Name 30 29 Carol 20 24 Bob
iloc
で列番号のリストを指定する場合は、元の順番を気にする必要があります。
それに対し、loc
で列名を指定する場合は、元の順番を気にする必要がありません。
loc
の方が便利ですが、通し番号で処理しないといけない場合は、iloc
が必要になります。
# 方法1 列の指定にリストを利用
df.iloc[0:5, [3,4]]
home_score | away_score | |
---|---|---|
0 | 0 | 0 |
1 | 4 | 2 |
2 | 2 | 1 |
3 | 2 | 2 |
4 | 3 | 0 |
# 方法2 列の指定にスライスを利用
df.iloc[0:5, 3:5]
home_score | away_score | |
---|---|---|
0 | 0 | 0 |
1 | 4 | 2 |
2 | 2 | 1 |
3 | 2 | 2 |
4 | 3 | 0 |
- 行と列を同時に指定して任意のデータを抽出している
- 行をスライス(数字)で指定している
- 列をスライス(数字)かリスト(数字)で指定している
- ここでの数字は列を左から0,1,2…と順につけていった数字(インデックス)になる
注意
iloc
で行や列を指定する際、スライスの[n1:n2]はn1以上n2未満という指定になる- 一般的なスライスと同じ
コメント