HOWTO · Pandas
Pandas DataFrameから複数の列を選択する方法
列名のリストを使う角括弧の構文、位置を指定する `.iloc`、ラベルを指定する `.loc` で、Pandas DataFrameから複数の列を選択する方法を解説します。構文の違いを比べ、目的に合う方法を選べます。
このページの内容
Pandas DataFrameから列名で複数の列を選ぶには、列ラベルのリストを角括弧の中に指定します。たとえば df[["Name", "Salary"]] のように書きます。列の位置が分かっている場合は .iloc、行と列をラベルで選びたい場合は .loc を使います。
__getitem__ 構文([])を使う
列名が分かっているなら、角括弧を使う方法が手軽です。外側の角括弧でDataFrameから列を選び、内側のリストで列ラベルを指定します。この節で扱うのは __getitem__ による選択です。元のDataFrameでの並び順にかかわらず、指定したリストの順番で列が返されます。
次の例では、同じ小さなDataFrameを使って、列名、列位置、列ラベルによる選択を比べます。どの結果にもすべての行が含まれ、列は指定した順に並びます。
import pandas as pd
df = pd.DataFrame({
"Name": ["Alice", "Bob", "Charlie", "David"],
"Age": [24, 30, 22, 35],
"City": ["New York", "Los Angeles", "Chicago", "Houston"],
"Salary": [70000, 80000, 65000, 90000],
})
by_name = df[["Name", "Salary"]]
by_position = df.iloc[:, [0, 3]]
by_label = df.loc[:, ["City", "Age"]]
print("By name:")
print(by_name.to_dict("records"))
print("\nBy position:")
print(by_position.to_dict("records"))
print("\nBy label:")
print(by_label.to_dict("records"))
By name:
[{'Name': 'Alice', 'Salary': 70000}, {'Name': 'Bob', 'Salary': 80000}, {'Name': 'Charlie', 'Salary': 65000}, {'Name': 'David', 'Salary': 90000}]
By position:
[{'Name': 'Alice', 'Salary': 70000}, {'Name': 'Bob', 'Salary': 80000}, {'Name': 'Charlie', 'Salary': 65000}, {'Name': 'David', 'Salary': 90000}]
By label:
[{'City': 'New York', 'Age': 24}, {'City': 'Los Angeles', 'Age': 30}, {'City': 'Chicago', 'Age': 22}, {'City': 'Houston', 'Age': 35}]
DataFrameに対する角括弧アクセスでは __getitem__ が呼び出されます。通常は、この特殊メソッドを直接呼び出すのではなく、読みやすい角括弧の構文を使います。
.iloc で位置を指定して選択する
.iloc は、整数位置で要素を選ぶPandasのインデクサーです。df.iloc[:, [0, 3]] では、カンマの前にあるコロンがすべての行を選び、[0, 3] が1列目と4列目を選びます。位置は0から数えるため、DataFrameの列順を変えると、同じ番号で選ばれるデータも変わることがあります。位置に意味がある場合や列ラベルが分からない場合は .iloc を使います。
.loc でラベルを指定して選択する
.loc は、ラベルを使うインデクサーです。df.loc[:, ["City", "Age"]] では、行の指定に :、列の指定にラベルのリストを使います。結果の列順は指定どおりで、City、Age の順になります。行の条件と列のリストを組み合わせることもできます。たとえば df.loc[df["Age"] > 25, ["Name", "City"]] と書くと、条件に一致する行だけを残し、指定した列を返します。ラベルを基準に選ぶ場合や、行と列を同時に選ぶ場合に .loc が便利です。
まとめ
列名で複数の列を選ぶには df[["a", "b"]]、整数位置で選ぶには .iloc、ラベルで選ぶには .loc を使います。必要な列を名前で表せるならラベルを使い、列の順番そのものが基準なら位置を使います。
よくある質問
列名で複数の列を選ぶにはどうすればよいですか? DataFrameの角括弧の中にラベルのリストを指定します。たとえば df[["column1", "column2"]] のように書きます。
.iloc と .loc の違いは何ですか? .iloc は0始まりの整数位置で選び、.loc はラベルで選びます。どちらもカンマで区切って行と列の指定を受け取ります。
行と列を同時に選択できますか? はい。.loc では、カンマの前に行ラベルまたは条件を置き、後ろに列ラベルを指定します。たとえば df.loc[df["Age"] > 25, ["Name", "City"]] のように書けます。
どの構文を使えばよいですか? 列名が分かっているなら、角括弧の中にリストを指定します。整数位置が分かっているなら .iloc、ラベルで選び、必要に応じて行も絞り込みたいなら .loc を使います。
列がたくさんある場合はどうすればよいですか? 必要な列名をリストに入れます。連続した範囲の列なら .iloc のスライスも使えますが、.iloc のスライスは終端位置を含みません。連続していない列を選ぶ場合は、位置またはラベルのリストを指定します。