この記事でわかること

  • pandasのsort_valuesで、表を1つまたは複数の列で並べ替える方法
  • nlargestで、上位の何件かだけを取り出す方法と、同じ値が並ぶときの扱い
  • 元の表を変えずに、結果を別のファイルの2つのシートに保存する手順
  • 数字が文字で入っているときや空欄があるときに、つまずきやすいところ

売上の表から上位の店舗や商品を毎回Excelで並べ替えて、別の表に写していると、手間がかかるうえに写し間違いも起きます。この記事では、PythonのpandasでExcelの表を並べ替え、上位の行を取り出して別のファイルに保存する手順を、架空の表で実行して確かめた結果とあわせて紹介します。

関数の働きは、2026年10月24日にpandasの公式のAPIリファレンスで確かめました。コードの動きは、この記事のために作った架空の売上の表で試しています。実在の会社や店舗のデータは使っていません。

先に結論: 全体はsort_values、上位だけならnlargest

先に結論を書くと、表全体を並べ替えるときはsort_valuesを使い、上位の何件かだけがほしいときはnlargestを使います。結果は別のファイルに保存し、元の表は書き換えません。 よく使う指定をまとめると、次のとおりです。

したいこと 指定
大きい順 降順にする
複数の列 列の一覧
上位n件 nlargest
同じ値も残す keep=all
空欄を先頭に 先頭を指定

sort_valuesで表を並べ替える

pandasのsort_valuesは、1つまたは複数の列の値で表を並べ替えます。並べ替えに使う列は、列名か列名の一覧で指定します。

並べ替えの向きはascendingで決めます。何も指定しなければ小さい順(昇順)で、ascending=Falseにすると大きい順(降順)になります。複数の列で並べ替えるときは、ascendingにも同じ数のTrue・Falseを並べて、列ごとに向きを変えられます。たとえば「売上は大きい順、同じ売上なら日付の早い順」のような並べ方です。

sort_valuesは、並べ替えた新しい表を返します。元の表の順番は変わりません。

nlargestで上位の行だけを取り出す

nlargestは、指定した列の値が大きい順に、先頭からn行を返します。pandasの資料では、sort_valuesで大きい順に並べてheadで先頭のn行を取るのと同じ結果で、より速いとしています。指定しなかった列も、そのまま一緒に返ります。

同じ値の行があるときの扱いは、keepで決めます。

  • keep="first"(何も付けないときと同じ): 先に出てくる行を優先して、ちょうどn行にする
  • keep="last": 後に出てくる行を優先する
  • keep="all": いちばん小さい値で並んだ行をすべて残す。n行より多くなることがある

手順: 並べ替えた表と上位の表を別のファイルに保存する

次のコードは、作業用のフォルダーにある架空の売上の表(sales.xlsx)を、売上の大きい順に並べ替え、上位3件を取り出して、別のファイル(sales_sorted.xlsx)の2つのシートに書き出します。sales.xlsxは読み込むだけなので、中身は変わりません。手元の表に使う場合は、ファイル名と列名を書き換え、念のため元のファイルを写しておいてから動かします。

import pandas as pd

# 元の表は読むだけで書き換えない
df = pd.read_excel("sales.xlsx")

# 売上の大きい順に並べ、同じ売上なら日付の早い順にする
sorted_df = df.sort_values(["売上", "日付"], ascending=[False, True])

# 売上の上位3件(3件目と同じ売上の行も残す)
top = df.nlargest(3, "売上", keep="all")
print("全体", len(sorted_df), "行 / 上位", len(top), "行")

# 2つのシートに分けて、別のファイルに保存する
with pd.ExcelWriter("sales_sorted.xlsx") as writer:
    sorted_df.to_excel(writer, sheet_name="並べ替え", index=False)
    top.to_excel(writer, sheet_name="上位", index=False)

実行には、Pythonとpandasのほか、xlsxのファイルを読み書きするopenpyxlが要ります。表と同じフォルダーで実行してください。pandasの資料では、1つのファイルの複数のシートに書くときは、ExcelWriterを作ってシートの名前を指定するとしています。index=Falseを付けると、表の左の行番号はファイルに書き出されません。

実行した結果

架空の表(7行。日付・店舗・売上の3列)で試すと、「全体 7 行 / 上位 4 行」と表示されました。

  • 「並べ替え」のシートは、売上18000の2行(日付の早い順)、15000の2行、12000、9000、3000の順になりました
  • 「上位」のシートは、18000の2行と、3位で並んだ15000の2行の、合わせて4行になりました
  • 元のsales.xlsxは、日付の順のまま変わりませんでした

動きを確かめたのは、作業PCのpandas 3.0.6(Python 3.12.10、openpyxl 3.1.5と組み合わせ)です。

自分で直すか、相談するかの判断

判断の目安は、「並べ替えに使う列が、数値として読めているか」です。売上の列が数値で、並べ替えた結果がExcelで並べ替えたときと同じなら、そのまま上位の表を使えます。表記の違いで同じ店舗が分かれているときは、先にそろえます。そろえ方は、PythonでExcelの表の文字の前後の空白と全角・半角をそろえる手順で紹介しています。

上位をどう決めるか(同じ値の行を含めるか、何件にするか)は、表を受け取る人の使い方で変わります。keepの違いで件数が変わることを伝えたうえで、表を受け取る人と決めます。

つまずきやすいところ

  • 数字が文字で入っている: 売上が「18,000」のようなカンマ付きの文字で入っていると、架空の表では、並べ替えが数の大きさではなく文字の順になり、「9,000」が先頭に来ました。nlargestはTypeErrorで止まりました。pandasの資料でも、文字などの型の列ではnlargestを使えないとしています
  • 件数がnより多い: keep="all"では、同じ値で並んだ行をすべて残すため、指定した件数を超えることがあります
  • 空欄の行の位置: pandasの資料では、sort_valuesは何も指定しなければ、空欄(欠損値)の行を最後に置くとしています。架空の表でも、売上が空欄の行は最後になりました。先頭に置くときはna_position="first"にします
  • 店舗ごとに分けたいとき: 店舗ごとに別のシートにする方法は、PythonでExcelの表を条件で分けて別々のシートに保存する手順で紹介しています
  • 合計してから並べたいとき: 店舗ごとの合計を出してから並べ替えるときは、先に集計します。集計の方法は、PythonでCSVを集計する手順で紹介しています

まとめ

  • 表全体はsort_valuesで並べ替え、ascendingで向きを、列名の一覧で複数の列を指定します
  • 上位の何件かだけがほしいときはnlargestを使い、同じ値の行の扱いはkeepで決めます
  • 結果はExcelWriterで別のファイルの2つのシートに保存し、元の表は書き換えません
  • 並べ替える列が数値として読めているか、空欄がどこに来るかを確かめてから使います