Python Excel操作 逆引き集 | 読み込み時に特定列だけ選ぶ

Python Python
スポンサーリンク

「全部の列はいらない」がデフォルトだと思ってほしい

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列が金額だと仮定して、

  1. usecols=["A", "C"] を使う
  2. header=Nonenames=["date", "amount"] を組み合わせる
  3. date を日付型に、amount を数値型に変換する

ここまで書けたら、df.head()df.info() で結果を確認してみてください。

練習2:orders.xlsx の 0列と2列だけを読み、月次の金額合計を出す

0列が日付、2列が金額だと仮定して、

  1. usecols=[0, 2] を使う
  2. 列名を ["date", "amount"] にする
  3. 月ごとの合計金額を計算して表示する

自分で書いてみて、もしどこかで詰まったら、その部分だけ教えてくれれば一緒にほぐします。


最後に

usecols は、「Excelのどの部分を、どこまで自分の世界に連れてくるか」を決めるフィルターです。
ここを丁寧に設計すると、

  • DataFrameが必要最小限で済む
  • 型変換や集計のコードが短くなる
  • バグの入り込む余地が減る

という、地味だけど本質的なメリットが手に入ります。

「この分析に本当に必要な列はどれか?」
それを毎回自分に問いながら usecols を書く癖をつけると、あなたのExcel処理コードは一段レベルが上がります。

タイトルとURLをコピーしました