PythonでExcelの表を並べ替えて上位の行を取り出す手順|売上の上位10件を別のファイルにする
PythonでExcelの表を並べ替えて上位の行を取り出す手順を、pandasの公式の資料をもとに解説します。複数の列での並べ替え、同じ値が並ぶときの上位の取り出し方、数字が文字のときの注意点を紹介します。
本記事はプロモーションを含みます。紹介する情報は、実際の成果や効果を保証するものではありません。
目次
この記事でわかること
- 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つのシートに保存し、元の表は書き換えません
- 並べ替える列が数値として読めているか、空欄がどこに来るかを確かめてから使います
よくある質問
大きい順(降順)に並べ替えるには、どうしますか?
pandasのsort_valuesで、ascending=Falseを指定します。何も指定しなければ小さい順(昇順)です。複数の列で並べ替えるときは、ascendingにも列と同じ数のTrue・Falseを並べて、列ごとに向きを決められます。
sort_valuesとnlargestは、どちらを使えばよいですか?
表全体を並べ替えて見たいときはsort_values、上位の何件かだけがほしいときはnlargestが向いています。pandasの資料では、nlargestはsort_valuesで大きい順に並べてheadで先頭を取るのと同じ結果で、より速いとしています。
上位3件のはずが、4件出てきたのはなぜですか?
nlargestにkeep="all"を付けると、3件目と同じ値の行もすべて残すためです。架空の表でも、3位の売上が2行で同じだったため、4行になりました。件数をちょうどにしたいときは、何も付けないか、keep="first"にします。
売上の列でnlargestを使うと、エラーになるのはなぜですか?
売上の列が文字として読まれている可能性があります。pandasの資料では、文字などの型の列ではnlargestを使えず、TypeErrorになるとしています。「18,000」のようにカンマ付きの文字で入っていないかを確かめ、数値に直してから使います。
並べ替えると、元の表の順番も変わりますか?
変わりません。sort_valuesは並べ替えた新しい表を返します。架空の表でも、元の表は日付の順のままで、Excelのファイルも書き換わりませんでした。