この記事でわかること

  • 数の列の件数・平均・中央値・ばらつきを、1つの表にまとめて見る方法
  • 平均と中央値が大きく離れたときに、打ち間違いを疑う読み方
  • 10%や90%など、見たい位置の値を変える方法と、そのときの注意
  • 文字が混ざった列や、店舗の列も結果に入れる方法

売上の明細を集計して報告する前に、数字に打ち間違いや空欄がないかを確かめたいことがあります。列を1つずつ並べ替えて目で見ていくと、列や行が増えるほど手間がかかります。この記事では、pandasのdescribeで、数の列ごとの件数・平均・中央値・最小・最大を1つの表にまとめ、集計の前に分布を確かめる手順を紹介します。

よりどころは、pandas 3.1.0の公式の資料のうち、DataFrame.describeとpandas.to_numericのページです。どちらも2026年11月1日に原文を読みました。例に出てくる店舗・数量・売上・値引きは、試すために作った架空の明細です。

先に結論: describeで数の列をまとめ、平均と中央値の差を見る

読み込んだ表にdescribe()を付けると、数の列ごとに、件数・平均・標準偏差・最小・25%・50%・75%・最大が1つの表になります。 平均が中央値(50%)から大きく離れていたら、極端に大きい値や小さい値が混ざっていないかを確かめます。結果の表の行は、次の意味です。

行の名前 意味 試した表の売上
count 空欄を除いた件数 9
mean 平均 155,666.7
std 標準偏差(ばらつきの目安) 309,365.1
min・max 最小・最大 31,000・980,000
25%・50%・75% 小さい順に並べたときの位置の値 48,000・53,000・62,000

describeのしくみ

pandasの資料では、describeは列ごとの分布の中心・ばらつき・形をまとめるもので、NaN(空欄)の値は除いて計算するとしています。初期の設定では、数の列だけが対象になります。

数の列の結果には、count・mean・std・min・maxと、求めた位置の値が入ります。位置の値は、何も指定しなければ25%・50%・75%で、50%は中央値と同じです。ほかの位置を見たいときは、percentilesに0から1までの数のリストを渡します。

文字の列も見たいときは、include="all"を渡します。文字の列には、件数(count)・値の種類の数(unique)・いちばん多い値(top)・その回数(freq)が入ります。

手順: 売上の明細の分布をまとめて確かめる

次のコードは、架空の売上の明細 sales.xlsx(店舗・数量・売上・値引きの4列)を読み、数の列の分布をまとめた表を画面に出してから、sales_summary.xlsx に保存します。sales.xlsx は読むだけで、書き換えません。

import pandas as pd

detail = pd.read_excel("sales.xlsx")   # 元の明細は読むだけ

summary = detail.describe()   # 数の列ごとに、件数・平均・中央値などをまとめる
print(summary.round(1))
summary.to_excel("sales_summary.xlsx")   # まとめた表を別のファイルに残す

pandasのほかに、xlsxを読み書きするopenpyxlを入れておきます。round(1)は画面に出すときだけ小数を1けたにそろえるもので、保存する表の値は丸めていません。

試した結果

架空の明細(10行)で動かしました。売上の列には、空欄を1つと、98000のつもりで1けた多く打った980000を入れています。値引きの列には、数のほかに「なし」という文字が1つ入っています。

  • 売上のcountは9で、空欄の行は数えられませんでした
  • 売上の平均は155,666.7、中央値(50%)は53,000で、平均が中央値の約3倍になりました。最大の980,000が平均を押し上げています
  • 結果に出たのは数量と売上の2列だけで、店舗と値引きの列は入りませんでした
  • sales_summary.xlsx には、A列にcountからmaxまでの行の名前が、B列とC列に数量と売上の値が入りました
  • 元の sales.xlsx のハッシュ値は、実行の前後で同じでした

使ったのは、Mac の作業PCのPython 3.12.15と、pandas 3.1.0・openpyxl 3.1.5です。保存したファイルはopenpyxlで読み直して確かめ、Excelのアプリでは開いていません。

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

目安は、「飛び抜けた値が、打ち間違いだと元の伝票や記録で確かめられるか」です。980000のように、元の記録と照らして正しい値が分かるなら、明細を直してからもう一度まとめます。

大口の注文のように、本当にあった値かもしれないときは、自分の判断で消したり直したりしません。平均ではなく中央値で報告するか、その行を分けて示すかを、表を使う人と相談して決めます。

つまずきやすいところ

  • 数の列なのに結果に出ない: 値引きの列は、「なし」という文字が1つ混ざっていたため、文字の列として読み込まれ、結果に入りませんでした。pd.to_numericにerrors="coerce"を付けると、数に直せない値は空欄になります。試したときも「なし」が空欄になり、値引きはcountが9の列として結果に出ました
  • percentilesを渡すと中央値の行が消える: 10%と90%を見ようとpercentiles=[0.1, 0.9]だけを渡すと、試した版では50%の行が出なくなりました。中央値も残すときは、percentiles=[0.1, 0.5, 0.9]のように0.5も入れます
  • 店舗の列も結果に入れたい: include="all"を付けると、店舗の列にcount・unique・top・freqが入りました。数の列のuniqueの欄や、文字の列のmeanの欄は、空欄(NaN)になります
  • topがいちばん多い店とは言い切れない: 試した表では、4つの店が2回ずつで並び、topには新宿店が出ました。資料では、いちばん多い値が複数あるときは、その中からどれかが選ばれるとしています。店ごとの回数を比べるときは、件数を数え直します
  • 空欄がどの行にあるかを知りたい: countで空欄の数は分かっても、どの行かは分かりません。空欄の行と列を一覧にする方法は、PythonでExcelの表の空欄を見つけて一覧にする手順で紹介しています
  • 分布を金額の範囲ごとの件数で見たい: 金額をいくつかの範囲に区切って数える方法は、PythonでExcelの数値を区切って範囲ごとの件数を数える手順にまとめています
  • 飛び抜けた値が、どの店のものかを並べて見たい: 売上の大きい順に順位の列を付ける方法は、PythonでExcelの表に順位の列を付ける手順が参考になります

まとめ

  • describe()で、数の列の件数・平均・中央値・最小・最大を1つの表にできます
  • 平均と中央値が大きく離れたら、飛び抜けた値を元の記録と照らします
  • percentilesを変えるときは、0.5も入れて中央値の行を残します
  • 文字が混ざった列は数に直してから、店舗の列はinclude="all"で見ます