「全部の列はいらない」がデフォルトだと思ってほしい
Excelをそのまま read_excel すると、シートの全列がDataFrameに入ります。
でも、実務で「全部の列を本当に使う」ことはほとんどありません。
不要な列まで読み込むと、処理は遅くなり、メモリも食い、DataFrameもゴチャゴチャします。
そこで使うのが usecols です。
「この列だけ欲しい」と最初に宣言しておくことで、読み込みの段階からデータをスリムにできます。
import pandas as pd
df = pd.read_excel("sales.xlsx", usecols=["A", "C"])
print(df.head())
Pythonこの一行で、「A列とC列だけを読む」という意思表示になります。
usecols の指定方法をきちんと整理する
列記号で指定するパターン(’A’, ‘B’, ‘C’)
Excelの列記号(A, B, C, …)で指定する方法です。
import pandas as pd
df = pd.read_excel("sales.xlsx", usecols=["A", "C"])
Pythonあるいは範囲で書くこともできます。
df = pd.read_excel("sales.xlsx", usecols="A:C") # A〜C列
Python「Excelの見た目そのままの感覚」で指定できるので、最初はこれが一番イメージしやすいと思います。
ただし、列の追加・削除で位置が変わるとズレるので、「列の位置が固定されている帳票」に向いています。
列番号で指定するパターン(0, 1, 2)
0始まりの列番号で指定する方法です。
import pandas as pd
df = pd.read_excel("sales.xlsx", usecols=[0, 2])
Pythonこれは「左から0番目、2番目の列だけ読む」という意味です。
列記号と同じく、「位置で選ぶ」スタイルなので、列名がないシートや、列名が信用できないシートに強いです。
列名で指定するパターン(’Date’, ‘Amount’)
列名がきちんと決まっているなら、列名で指定するのが一番安全で読みやすいです。
import pandas as pd
df = pd.read_excel("sales.xlsx", usecols=["Date", "Amount"])
Python列名で指定すると、「このコードは何を使っているか」が一目でわかります。
列の順番が変わっても壊れにくいので、本番コードでは基本的にこのスタイルをおすすめします。
usecols と他の引数を組み合わせて「最初からきれいに」読む
usecols + names で「位置で選んで名前を付ける」
列名がない、あるいは信用できないけれど、列の位置はわかっている場合の鉄板パターンです。
import pandas as pd
df = pd.read_excel(
"no_header.xlsx",
header=None,
usecols=[0, 2, 3], # 0列:日付, 2列:数量, 3列:金額
names=["date", "qty", "amount"] # 自分で列名を付ける
)
print(df.head())
Pythonここで重要なのは、「位置で選ぶ」と「名前を付ける」をセットでやっていることです。
Excel側の列名に振り回されず、自分の都合のいい列名で受け取れます。
usecols + parse_dates + dtype で型まで整える
特定列だけを読みつつ、その列の型も同時に整えると、読み込み直後からすぐ集計に入れます。
import pandas as pd
df = pd.read_excel(
"sales.xlsx",
usecols=["Date", "Product", "Qty", "Amount"],
parse_dates=["Date"],
dtype={"Product": "string"}
)
df["Qty"] = pd.to_numeric(df["Qty"], errors="coerce")
df["Amount"] = pd.to_numeric(df["Amount"], errors="coerce")
print(df.head())
Python「必要な列だけ読む」「日付は日付型にする」「コードは文字列にする」「数値はちゃんと数値にする」
これを読み込み時点でやっておくと、後のコードが一気に短くなります。
実践テンプレートでイメージを固める
テンプレ1:A,B列だけ読み込んで日付と金額として扱う
import pandas as pd
df = pd.read_excel(
"sales.xlsx",
usecols=["A", "B"], # A列:日付, B列:金額 だとわかっている前提
header=None,
names=["date", "amount"], # 自分で列名を付ける
parse_dates=["date"]
)
df["amount"] = pd.to_numeric(df["amount"], errors="coerce")
print(df.head())
Pythonここでは、列記号で位置を指定しつつ、names で意味のある列名を付けています。
列名がないシートや、列名が日本語で扱いづらいときに非常に有効です。
テンプレ2:列番号で 0,2 列だけ読み、月次合計を出す
import pandas as pd
df = pd.read_excel(
"sales.xlsx",
usecols=[0, 2], # 0列:日付, 2列:金額
header=None,
names=["date", "amount"],
parse_dates=["date"]
)
df["amount"] = pd.to_numeric(df["amount"], errors="coerce")
monthly = (
df.assign(month=df["date"].dt.to_period("M"))
.groupby("month", as_index=False)["amount"].sum()
)
print(monthly)
Python「列番号で選ぶ → 列名を付ける → 型を整える → 集計する」という流れが、そのまま一つのテンプレートになっています。
テンプレ3:列名で必要な列だけ読み、顧客別集計をする
import pandas as pd
df = pd.read_excel(
"orders.xlsx",
usecols=["CustomerID", "CustomerName", "Amount"],
dtype={"CustomerID": "string"}
)
df["Amount"] = pd.to_numeric(df["Amount"], errors="coerce")
summary = (
df.groupby(["CustomerID", "CustomerName"], as_index=False)["Amount"]
.sum()
.sort_values("Amount", ascending=False)
)
print(summary.head())
Python列名で指定すると、「このコードは何を前提にしているか」が非常に読みやすくなります。
本番運用するスクリプトでは、このスタイルを基本形にしていいレベルです。
つまずきポイントを先に潰しておく
usecols と names の列数が合わない
usecols=[0,2,3] としているのに、names=["date", "amount"] のように2つしか名前を用意していないとエラーになります。
「読み込む列の数」と「names の数」は必ず一致させてください。
列名指定と実際の列名が微妙に違う
usecols=["Date", "Amount"] と書いたのに、Excel側が「DATE」「金額」だったりすると、その列は読まれません。
最初は一度 df = pd.read_excel("file.xlsx") で全部読み、print(df.columns) で正確な列名を確認してから usecols を書くと安全です。
列記号・列番号は「位置が変わるとズレる」
列記号や列番号で指定する場合、Excel側で列が追加・削除されると意味が変わります。
「この帳票は列の位置が固定されている」と自信があるときだけ使う、という意識を持っておくと事故が減ります。
小さな練習問題
練習1:sales.xlsx の A列とC列だけを読み、date と amount という列名で扱う
条件は次の通りです。
A列が日付、C列が金額だと仮定して、
usecols=["A", "C"]を使うheader=Noneとnames=["date", "amount"]を組み合わせるdateを日付型に、amountを数値型に変換する
ここまで書けたら、df.head() と df.info() で結果を確認してみてください。
練習2:orders.xlsx の 0列と2列だけを読み、月次の金額合計を出す
0列が日付、2列が金額だと仮定して、
usecols=[0, 2]を使う- 列名を
["date", "amount"]にする - 月ごとの合計金額を計算して表示する
自分で書いてみて、もしどこかで詰まったら、その部分だけ教えてくれれば一緒にほぐします。
最後に
usecols は、「Excelのどの部分を、どこまで自分の世界に連れてくるか」を決めるフィルターです。
ここを丁寧に設計すると、
- DataFrameが必要最小限で済む
- 型変換や集計のコードが短くなる
- バグの入り込む余地が減る
という、地味だけど本質的なメリットが手に入ります。
「この分析に本当に必要な列はどれか?」
それを毎回自分に問いながら usecols を書く癖をつけると、あなたのExcel処理コードは一段レベルが上がります。
