Python Excel操作 逆引き集 | 部分行だけ読み込む(nrows)

Python Python
スポンサーリンク

「全部の行はいらない」という発想を持つ

Excelをそのまま read_excel すると、シートの全行がDataFrameに入ります。
でも、実務や検証では「とりあえず先頭だけ見たい」「巨大ファイルなので一部だけ読みたい」という場面が多いです。

そこで使うのが nrows です。
nrows=100 のように指定すると、「ヘッダーの下から 100 行だけ読む」という意味になります。
これだけで、試行錯誤やデバッグがかなり軽くなります。


基本形:nrows=100 の挙動をきちんと理解する

最小コードと動きのイメージ

import pandas as pd

df = pd.read_excel("big_sales.xlsx", nrows=100)

print(len(df))      # 100
print(df.head())
Python

ここでのポイントは、「ヘッダー行はカウントに含まれない」ということです。
nrows=100 は、「ヘッダーの次の行から 100 行分のデータを読む」という指定です。

つまり、行構造がこうだとします。

1行目: ヘッダー(列名)
2行目〜100000行目: データ

このとき nrows=100 を指定すると、2〜101行目までが読み込まれます。
「ファイル全体は10万行あるけど、まずは100行だけで動作確認したい」というときに非常に便利です。

skiprows と組み合わせたときのイメージ

skiprows と組み合わせると、「どこから何行読むか」を細かくコントロールできます。

df = pd.read_excel(
    "big_sales.xlsx",
    skiprows=range(1, 1001),  # 2〜1001行目を飛ばす(1行目はヘッダー)
    nrows=100                 # その次の100行だけ読む
)
Python

この例だと、「ヘッダーのあと1000行分をスキップし、その次の100行だけ読む」という動きになります。
巨大ファイルの中の「一部分だけ」を検証したいときに使えます。


よくある使い方のパターン

まずは先頭数行だけでロジックを試す

巨大なExcelに対して、いきなり全行を読み込んで処理を書くと、
毎回の実行が重くて、試行錯誤がつらくなります。

import pandas as pd

df_sample = pd.read_excel(
    "big_sales.xlsx",
    nrows=200,
    parse_dates=["Date"],
    usecols=["Date", "Product", "Amount"]
)

print(df_sample.head())
print(df_sample.info())
Python

ここで「列名」「型」「値の雰囲気」を確認しながら、
集計や前処理のロジックをまずは df_sample に対して作ります。

ロジックが固まったら、nrows を外して本番の全件処理に切り替える、という流れが非常に現実的です。

先頭だけでなく「一部分」を検証したい場合

例えば、「10万行あるうちの、真ん中あたりの100行を見たい」という場合は、skiprows と組み合わせます。

import pandas as pd

start = 10000   # ヘッダーの次から数えて何行目から見たいか
length = 200    # 読みたい行数

df_part = pd.read_excel(
    "big_sales.xlsx",
    skiprows=range(1, 1 + start),  # ヘッダーの次から start 行分を飛ばす
    nrows=length
)

print(df_part.head())
print(len(df_part))
Python

ここで大事なのは、「ヘッダー行は飛ばさない」ことです。
skiprows の範囲を range(1, 1 + start) としているのは、0行目(ヘッダー)は残し、1行目以降をスキップするためです。


nrows と一緒にやっておきたいこと

usecols と組み合わせて「行も列も絞る」

巨大ファイルに対しては、「行も列も絞る」が鉄則です。

import pandas as pd

df_sample = pd.read_excel(
    "big_sales.xlsx",
    nrows=500,
    usecols=["Date", "Store", "Amount"],
    parse_dates=["Date"]
)

print(df_sample.head())
Python

こうしておくと、試行錯誤のたびに「500行 × 必要な列だけ」の軽いDataFrameで済みます。
ロジックが固まったら、nrows を外して全件処理に切り替えればOKです。

型変換や前処理の「試し書き」に使う

例えば、金額列にカンマが入っているようなケース。

import pandas as pd

df_sample = pd.read_excel(
    "sales.xlsx",
    nrows=200,
    usecols=["Date", "Amount"],
    parse_dates=["Date"]
)

df_sample["Amount"] = (
    df_sample["Amount"]
    .astype(str)
    .str.replace(",", "", regex=False)
    .astype(float)
)

print(df_sample.head())
Python

まずは nrows 付きのサンプルで変換ロジックを試し、
うまくいったら同じ処理を全件に適用する、という流れが安全です。


実践テンプレート

テンプレ1:巨大売上ファイルの先頭1000行だけで月次集計を試す

import pandas as pd

df_sample = pd.read_excel(
    "huge_sales.xlsx",
    nrows=1000,
    usecols=["Date", "Amount"],
    parse_dates=["Date"]
)

df_sample["Amount"] = pd.to_numeric(df_sample["Amount"], errors="coerce")

monthly = (
    df_sample.assign(month=df_sample["Date"].dt.to_period("M"))
             .groupby("month", as_index=False)["Amount"].sum()
)

print(monthly)
Python

このテンプレートは、「まずは軽いサンプルでロジックを作る」ための典型形です。
本番では nrows を外し、同じ処理を全件に対して実行します。

テンプレ2:10万行ファイルの中間部分だけをチェックする

import pandas as pd

start = 50000   # 真ん中あたりから
length = 300    # 300行だけ見る

df_mid = pd.read_excel(
    "huge_sales.xlsx",
    skiprows=range(1, 1 + start),
    nrows=length,
    usecols=["Date", "Product", "Amount"],
    parse_dates=["Date"]
)

print(df_mid.head())
print(df_mid.tail())
Python

このテンプレートは、「特定の範囲のデータにだけ変な値が入っていないか」などを確認したいときに使えます。


つまずきやすいポイントと注意点

「nrows はヘッダーを含むのか?」問題

もう一度はっきりさせると、nrows は「ヘッダーの下から何行読むか」です。
ヘッダー行はカウントに含まれません。

つまり、

  • ヘッダー行
  • データ1行目
  • データ2行目

という構造のとき、nrows=10 は「データ1〜10行目」を読みます。

skiprows と組み合わせたときのズレ

skiprows でヘッダー行まで飛ばしてしまうと、header の扱いが変わります。
基本的には、「ヘッダー行は飛ばさない」「飛ばすのはヘッダーの下の行だけ」と覚えておくと混乱が減ります。

巨大ファイルで複雑な skiprows を書く前に、
一度小さなファイルや行数で挙動を確認してから本番に適用するのが安全です。


小さな練習問題

練習1:big_sales.xlsx の先頭200行だけを読み、Date と Amount で月次合計を出す

条件は次の通りです。

  1. nrows=200 を使う
  2. usecols=["Date", "Amount"] を指定する
  3. parse_dates=["Date"] で日付型にする
  4. 月ごとの合計金額を計算して表示する

まずはこのサンプルでロジックを作り、うまくいったら nrows を外して全件処理にしてみてください。

練習2:10万行ファイルのうち、2万行目から300行だけを読み、異常値がないか確認する

条件は次の通りです。

  1. skiprowsnrows を組み合わせて、「2万行目から300行」を読む
  2. 読み込んだDataFrameの Amount 列について、最大値・最小値・平均を表示する

ここまでできると、「巨大Excelを相手にするときの、賢い付き合い方」がかなり見えてきます。


最後に

nrows は、「全部読む前に、まず一部だけで考える」ための道具です。
これはプログラミングだけでなく、データ分析全般に通じる大事な姿勢でもあります。

  • いきなり全件で戦わない
  • まずは小さく試す
  • ロジックが固まってから本番に当てる

そのためのスイッチが、nrows です。
あなたの手元に「開くだけで重いExcel」があるなら、まずは nrows 付きで軽く触ってみるところから始めてみてください。

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