pandas入門 データ処理をやってみよう
Pythonをブラウザで実行しながら実践的に学ぶ
Pythonの基礎からソフトウェアアーキテクチャ,アルゴリズムなどの応用的な内容まで幅広く学べます。
ブラウザ上で直接Pythonコードを試すことができ、実践的なスキルを身につけることが可能です。
毎日の業務の中で、「データ処理」に頭を悩ませている方は多いのではないでしょうか。たとえば、何十万行もある巨大なエクセルファイルを開こうとして、パソコンの画面が真っ白にフリーズしてしまった経験はありませんか?
あるいは、毎月送られてくる複数の売上データを、手作業でコピー&ペーストして一つのファイルにまとめるという、気の遠くなるようなルーティンワークに時間を奪われていませんか?
IT業界でエンジニアとして働き始めてから10年が経ちますが、私自身も新人時代はそうした「終わりの見えない手作業」や「エクセルの限界」に何度も泣かされてきました。特にデータ分析や機械学習がビジネスの現場で当たり前になりつつある現代において、手作業によるデータ処理は時間的にも精度的にも限界を迎えています。人間が手作業で行う以上、どうしてもコピーミスや行のズレといったヒューマンエラーが発生してしまうからです。
そんな「データ処理のストレス」から私たちを解放してくれる魔法のようなツールが、Pythonというプログラミング言語で使える「pandas(パンダス)」というライブラリです。pandasを使えば、エクセルがフリーズするような数百万行のデータでも瞬時に読み込み、複雑な集計や不要なデータの削除、複数のデータの結合などを、たった数行のコードで自動化することができます。
この記事では、プログラミングやITの専門知識がない初心者の方に向けて、pandasの基本から実践的な使い方までを、できる限りわかりやすく、親しみやすい言葉で解説していきます。
pandasとは何か?なぜ世界中のエンジニアが愛用しているのか¶
pandasについて具体的な使い方を学ぶ前に、まずは「pandasとは一体何者なのか」についてお話しさせてください。
pandasは、Pythonというプログラミング言語の中で、データを効率的に扱うために作られた拡張ツール(ライブラリ)の一つです。名前の由来は、動物のパンダではなく、計量経済学の用語である「Panel Data(パネルデータ:時間と複数の項目を組み合わせたデータ)」から来ています。
では、なぜ世界中のエンジニアやデータサイエンティストが、こぞってpandasを愛用しているのでしょうか?
pandasが愛用されている理由¶
それは、pandasが「表形式のデータ」を扱う天才だからです。
私たちが普段見慣れている、縦(行)と横(列)で構成されたエクセルのような表データを、プログラミングの世界で驚くほど簡単に、そして高速に操作できる仕組みを提供してくれます。
ここで、多くの方が疑問に思うかもしれません。 「表データを扱うなら、今まで通りエクセルを使えばいいのではないか?」と。
確かに、数十行から数千行程度のデータで、目で見て確認しながらグラフを作ったり、簡単な関数を入れたりするだけであれば、エクセルは非常に優秀なツールです。直感的な操作性においては、右に出るものはありません。
しかし、データが巨大になったり、処理の手順が複雑になったりした途端に、エクセルは悲鳴を上げ始めます。私がシステム開発の現場で体験した実例をお話ししましょう。ある時、クライアントから「過去5年分の全国の店舗の購買データ」を渡されました。ファイルサイズは数ギガバイト、行数は数千万行に及ぶ巨大なCSVファイルです。これをエクセルで開こうとした後輩エンジニアのパソコンは、数十分間ファンを激しく鳴らした末に、無情にも「メモリ不足」のエラーを吐き出してフリーズしてしまいました。
エクセルは基本的に、画面上にすべてのデータを表示して人間が操作することを前提としているため、巨大なデータには不向きなのです。また、エクセルで複雑なフィルターをかけたり、マクロ(VBA)を組んだりしてデータ処理を自動化することも可能ですが、後から別の人がファイルを見たときに「どの順番で何の処理をしたのか」がブラックボックス化しやすく、保守や引き継ぎが非常に困難になるという弱点があります。
一方のpandasは、裏側でデータを効率的に処理することに特化しています。数千万行のデータであっても、メモリの許す限り瞬時に読み込み、集計や加工を行うことができます。さらに、すべての処理手順を「コード」として書き残すため、「いつ、誰が、どのような処理を行ったか」が一目瞭然になります。昨日自分が書いたコードを、明日別の人が全く同じように実行し、同じ結果を得ることができる。この「再現性の高さ」こそが、ビジネスの現場でpandasが重宝される最大の理由なのです。
エクセルとpandasの役割は、対立するものではありません。データの最初の整形や大規模な集計、自動化処理をpandasで一気に終わらせて、最終的なきれいな表やグラフを使ったレポート作成、人間が目で見て微調整する作業をエクセルで行う。このように適材適所で使い分けるのが、現代のデータ処理のベストプラクティスと言えます。
エクセルとpandasの違い¶
それぞれの特徴をより明確に理解していただくために、エクセルとpandasの違いを表にまとめてみました。
| 比較項目 | エクセル(Excel) | pandas(Pythonライブラリ) |
|---|---|---|
| 得意なデータサイズ | 小〜中規模(数万行程度までが快適) | 大規模(数百万行〜数千万行でも高速に処理可能) |
| 操作のメイン | マウス操作、画面を見ながらの直感的な編集 | プログラミングコードによる指示と自動化 |
| 処理の再現性 | 低い(手作業の履歴が残りにくい、属人化しやすい) | 非常に高い(コードを実行すれば誰でも同じ結果になる) |
| 得意なこと | データの視覚的な確認、手動での微調整、グラフ化 | 大量データの高速集計、複雑な条件での抽出、システム連携 |
| 習得のハードル | 比較的低い(誰でもすぐに使い始められる) | プログラミングの基礎知識が必要(最初は少し壁がある) |
このように、pandasは「大量のデータを」「正確に」「自動的に」処理したい場面で、その真価を発揮します。10年間エンジニアをやってきて、pandasを覚えて後悔したという人には出会ったことがありません。むしろ「もっと早く知っておけば、あの徹夜作業はしなくて済んだのに」と口にする人を何人も見てきました。
pandasの強力なパワーの背景がわかったところで、次はその中核となる「データフレーム」という概念について、詳しく見ていきましょう。ここを理解すると、今後の学習がぐっと楽になります。
pandasの心臓部、「データフレーム」と「シリーズ」を理解する¶
pandasを使いこなす上で、絶対に避けては通れない、しかしとても重要な2つの言葉があります。
それが「データフレーム(DataFrame)」と「シリーズ(Series)」です。なんだか難しそうな横文字が出てきて不安になった方もいるかもしれませんが、安心してください。これらは私たちが普段見慣れている「表」を、pandasの世界の言葉で言い換えているだけなのです。
データフレーム¶
まずは「データフレーム」について想像してみてください。
あなたがいつも仕事で使っている、エクセルのワークシートそのものを思い浮かべていただければ完璧です。縦にデータが並ぶ「行」があり、横に項目が並ぶ「列」がある。
顧客の名簿であれば、1行目にAさん、2行目にBさんのデータが並び、列には「名前」「年齢」「住所」といった項目が設定されている。このような縦横の2次元の表形式のデータのまとまりを、pandasではデータフレームと呼んでいます。pandasを使った作業の9割以上は、このデータフレームをこねくり回す作業だと言っても過言ではありません。
シリーズ¶
次に「シリーズ」です。
これはデータフレームを構成する部品だと考えてください。
先ほどの顧客名簿のデータフレームから、「年齢」という列だけを縦にスパッと切り取って抜き出したとします。この「1列だけのデータ」の集まりを、pandasでは「シリーズ」と呼びます。言い換えれば、複数のシリーズが横にガチャンとくっついて集まったものが、データフレームになるというわけです。
エンジニアとして多くの初心者を教えてきた経験から言うと、ここでつまずく方が意外と多いのです。「今自分が操作しているのは、表全体(データフレーム)なのか、それとも特定の1列(シリーズ)なのか」を意識することが、pandas上達の最初の近道です。たとえば「全員の平均年齢を出したい」という時は、「年齢」という1列(シリーズ)に対して計算を行います。一方で、「年齢が20歳以上で、かつ東京に住んでいる人をリストアップしたい」という時は、表全体(データフレーム)に条件を当てはめて絞り込むことになります。
この「データは縦横の表(データフレーム)で管理され、1つの列を取り出すとシリーズになる」というイメージさえ頭の片隅に置いておけば、これから登場するコードの意味が驚くほどスッと理解できるようになります。
概念の理解ができたところで、いよいよ実際にPythonのコードを書いて、pandasを動かしてみる準備を始めましょう。
さっそく動かしてみよう!pandasの準備とデータの読み込み¶
ここからは、実際にコードを見ながらpandasの使い方を学んでいきます。
もし手元にPythonを動かせる環境(Google Colaboratoryなどが初心者にはおすすめです)があれば、ぜひ一緒に手を動かしながら読み進めてみてください。自分で書いたコードが動いてデータが処理される感覚は、何度味わっても楽しいものです。
pandasのインポート¶
pandasを使うためには、まず最初に「今からpandasという便利な道具箱を使いますよ」とPythonに宣言する必要があります。これを「インポート(読み込み)」と呼びます。
import pandas as pd
このたった1行が、pandasの世界への入り口です。ここで「as pd」というおまじないがついていますが、これは「pandasという単語は毎回書くのが長くて面倒なので、これ以降は『pd』という短いあだ名で呼びますね」という意味です。これは世界中のPythonエンジニアの共通の約束事のようなもので、私の10年間のエンジニア人生の中で、pandasを「pd」以外のあだ名で呼んでいる人を見たことがありません。皆さんも深く考えず、このまま暗記してしまって大丈夫です。
準備ができたら、次はデータを読み込んでみましょう。実務で最もよく扱うのは、カンマで区切られたテキストデータである「CSVファイル」です。システムから売上データなどをダウンロードすると、大抵はこのCSV形式になっていますよね。pandasを使えば、このCSVファイルをたった1行で先ほど説明した「データフレーム」として読み込むことができます。
データの読み込み¶
ここでは、手元に「sales_data.csv」という社員の売上データが保存されたファイルがあると仮定して進めます。
# CSVファイルを読み込んで、dfという名前のデータフレームに保存する
df = pd.read_csv("sales_data.csv", encoding="utf-8")
たったこれだけです。エクセルでファイルメニューから開く手順よりも、はるかに短いですよね。
ここで読み込んだデータは、「df(ディーエフ)」という変数(データを入れておく箱)に保存しました。これもエンジニアの習慣で、DataFrameの頭文字をとって「df」と名付けることが非常に多いです。
そして、ここで一つ、エンジニア歴10年の私から実務で絶対に役立つ重要なアドバイスをさせてください。コードの中にある「encoding="utf-8"」という部分に注目してください。日本のビジネス現場において、データ処理で最も初心者を絶望させるのが「文字化け」です。
エクセルで作られたCSVファイルは「Shift-JIS(あるいはcp932)」という日本語特有のルールで文字が保存されていることが多いのですが、Pythonは標準で世界基準の「UTF-8」というルールで文字を読もうとします。ルールが違うため、読み込んだ途端にデータが謎の記号の羅列になってしまうのです。
私も新人時代、クライアントに提出する直前のデータが盛大に文字化けしていて、血の気が引いた経験があります。もし「utf-8」で読み込んでエラーが出たり文字化けしたりした場合は、慌てずに「encoding="cp932"」に変更してみてください。日本のデータ処理において、このエンコーディングの知識は文字通りあなたの命を救うことになるでしょう。
無事にデータを読み込むことができたら、次はその中身がどうなっているのかを、全体を俯瞰して確認する方法をご紹介します。
データと初対面!中身を優しくのぞき見する基本のテクニック¶
無事にCSVファイルを「df」として読み込めました。エクセルなら画面にパーッと表が表示されるので安心できますが、Pythonの場合は画面に変化がないので「本当に読み込めたのかな?」と少し不安になりますよね。
ここで「よし、中身を全部表示してみよう!」と思って print(df) と書きたくなる気持ちは痛いほどわかります。しかし、ちょっと待ってください。もし読み込んだデータが100万行あったらどうなるでしょうか。画面が文字で埋め尽くされ、スクロールしてもスクロールしてもデータが終わらない……という悲惨な状況に陥ります。
そこでpandasには、データ全体を俯瞰し、どのような状態になっているのかをスマートに確認するための便利な機能がいくつも用意されています。実務において、データを受け取ったエンジニアがまず最初に行う「データとの初対面の挨拶」のような処理を順番に見ていきましょう。
先頭のデータを確認¶
まずは、データが正しく読み込めているか、先頭の数行だけをチラッと覗き見する処理です。これには head() という機能を使います。
# データの先頭5行だけをきれいに表示する
print(df.head())
これを実行すると、データの1行目から5行目までと、各列の項目名(ヘッダー)がきれいな表形式で表示されます。「あ、ちゃんと名前や売上の列が入っているな」「文字化けしていないな」という安心感を得るための、最も頻繁に使うコードです。括弧の中に数字を入れると、たとえば df.head(10) であれば10行表示させることもできます。逆にデータの最後尾を確認したい場合は、尻尾を意味する tail() を使います。
データの大きさを確認¶
次に知りたいのは、「このデータは一体どれくらいの大きさなのか」ということです。エクセルで一番下までスクロールして行数を確認する作業を、pandasでは次のように一瞬で行います。
# データの行数と列数を確認する(形を知る)
print(df.shape)
これを実行すると、例えば (10000, 5) のような結果が返ってきます。これは「10,000行のデータがあり、5つの列(項目)で構成されていますよ」という意味です。データを受け取った時に、事前に聞いていた件数と一致しているかを確認するために、必ず実行する処理の一つです。
データの詳細を一覧表示¶
そして、データの全体像を把握するために、私が最も重宝しているのが info() という機能です。これは、データフレームの「健康診断のカルテ」のようなものです。
# データの詳細な情報を一覧表示する
print(df.info())
これを実行すると、各列にどんな名前がついていて、何件のデータが入っていて、それが文字データなのか数値データなのか、といった詳細な情報がズラッと表示されます。特に重要なのが「空っぽのデータ(欠損値)がないか」をここで一目で確認できる点です。
初めて見るデータを受け取った時、いきなり計算や分析を始めるのは大変危険です。「敵を知り、己を知れば百戦危うからず」という言葉があるように、まずは head(), shape, info() を使ってデータの性質や状態をしっかりと把握することが、プロのエンジニアの鉄則です。
データの大まかな形がわかってきましたね。では次に、このデータの中から「自分が本当に欲しい部分だけを切り出す」という、実務で最もよく使う操作に進んでいきましょう。
欲しいデータだけを狙い撃ち!列と行のスマートな抽出法¶
データの全体像を把握したら、次に行うのは「必要な情報の抽出」です。100列もある巨大なデータから、分析に必要な「社員名」と「売上金額」の2列だけを取り出したり、全社員のデータの中から「営業部」のデータだけを絞り込んだりする作業です。エクセルのフィルター機能や列の非表示機能にあたる部分ですが、pandasならはるかに直感的かつ柔軟に行うことができます。
まずは、特定の「列(縦のライン)」だけを抽出する方法から見ていきましょう。これは非常に簡単で、データフレームの箱(df)の横に、欲しい列の名前を四角い括弧 [] で指定するだけです。
# 「社員名」の列(シリーズ)だけを抽出する
names = df["社員名"]
print(names.head())
これで、社員名の列だけが切り出されました。この時、取り出されたデータは1列だけなので、先ほど学んだ「シリーズ」という状態になっています。もし、「社員名」と「売上金額」のように複数の列を同時に取り出したい場合は、どうすればよいでしょうか。その場合は、括弧の中にもう一つ括弧を入れて、リストの形で複数の名前を指定します。
# 「社員名」と「売上金額」の2つの列を抽出する
subset_df = df[["社員名", "売上金額"]]
print(subset_df.head())
括弧が二重 [[]] になるのが少しややこしいですが、最初は「複数欲しい時は括弧を二重にする」と呪文のように覚えてしまって大丈夫です。この場合は2列以上の表データになるため、取り出した結果は再び「データフレーム」になります。
列の抽出ができるようになったら、次は「行(横のライン)」の絞り込みです。実務では「売上が100万円以上のデータだけを見たい」「部署が『営業部』の人だけを抽出したい」といった条件での絞り込みが頻繁に発生します。エクセルでオートフィルタを設定して条件を入れる作業ですね。
pandasで条件による絞り込みを行う時は、データフレームに対して「こういう条件に合致する行だけを残してね」とお願いするような書き方をします。
# 売上金額が100万円以上の行だけを抽出する
high_sales = df[df["売上金額"] >= 1000000]
print(high_sales.head())
少し書き方が独特ですよね。df[ 条件式 ] という形になっています。中の df["売上金額"] >= 1000000 の部分が「売上金額が100万以上ですか?」という質問になっており、pandasは全行に対してこの質問を投げかけ、「はい(True)」と答えた行だけを抽出して新しいデータフレームを作ってくれる、という仕組みです。
もちろん、文字データでの絞り込みも可能です。
# 部署が「営業部」の行だけを抽出する
sales_dept = df[df["部署"] == "営業部"]
print(sales_dept.head())
ここでの注意点は、等しいことを表す記号が = ではなく、2つ重ねた == になることです。プログラミングの世界では、1つの = は「代入(右のものを左の箱に入れる)」を意味するため、等しいかどうかを比較する時は == を使うというルールがあるのです。
さらに、「営業部で、かつ売上が100万以上」のように複数の条件を組み合わせることも可能です。エクセルで複雑な複合条件のフィルターを作ると、後から見た時に何の条件が入っているのかわからなくなることがありますが、pandasならコード上に条件が明記されるため、チームでの共有も非常にスムーズになります。
欲しいデータを自由自在に切り出せるようになると、いよいよデータ処理が面白くなってきます。しかし、現実のデータは私たちが期待するほどきれいではありません。次は、データ処理の現場で誰もが直面する「汚いデータ」の対処法についてお話しします。
エンジニアの宿敵「欠損値」をキレイにお掃除するデータクレンジング¶
これまで順調にpandasの操作を学んできましたが、ここで少し耳の痛い、しかし現実的なお話をしなければなりません。
私たちが学校の授業や本で学ぶデータは、すべての項目がきれいに埋まっている「理想的なデータ」です。しかし、エンジニア歴10年の経験から断言しますが、ビジネスの現場で渡される生データが最初からきれいであることは絶対にありません。
ある行は「年齢」の欄が空っぽだったり、別の行ではアンケートの未回答が「N/A」や「-」といった謎の記号で埋められていたりします。このような、データが存在すべきなのに空っぽになっている状態を、専門用語で「欠損値(けっそんち)」と呼びます。pandasでは、この欠損値を見つけると「NaN(Not a Numberの略)」という特別な目印をつけて教えてくれます。
この欠損値をそのまま放置して合計や平均を計算しようとすると、エラーになったり、全く見当違いな計算結果が出たりしてしまいます。そのため、データ分析の初期段階で必ずこの欠損値を「お掃除」する作業が必要になります。これをデータクレンジングと呼びます。
欠損値のお掃除方法は、大きく分けて「削除する」か「別の値で穴埋めする」の2パターンしかありません。
まずは、最もシンプルな「削除する」方法です。これは「データが欠けている行は、信用できないから丸ごと消してしまおう」という大胆なアプローチです。これには dropna() という機能を使います。
# どこか1つでも空欄(NaN)がある行をすべて削除する
clean_df = df.dropna()
print(clean_df.shape)
このコードを実行すると、欠損値を含む行が一掃され、きれいなデータだけが残ります。非常に簡単で便利なのですが、実務で使う際には細心の注意が必要です。なぜなら、1つの項目の空欄を理由に、他の重要な情報(たとえば高額な売上金額など)を持つ行まで消去してしまう可能性があるからです。「削除」は強力な武器ですが、データ全体の量が大きく減ってしまうリスクを伴います。
そこで、もう一つのアプローチである「穴埋めする」方法が重要になってきます。これは「空欄を消すのではなく、無難な値を入れてデータを活かそう」という考え方です。これには fillna() という機能を使います。
# 年齢の空欄(NaN)を、とりあえず「0」で埋める
df["年齢"] = df["年齢"].fillna(0)
# 部署の空欄(NaN)を、「未所属」という文字で埋める
df["部署"] = df["部署"].fillna("未所属")
このように、数値の空欄には「0」を、文字の空欄には「未設定」や「不明」といったダミーの文字を入れることで、エラーを防ぎつつデータを保持することができます。より高度な分析を行う場合は、年齢の空欄に「全社員の平均年齢」を計算して代入する、といったテクニックもよく使われます。
「欠けているデータを消すのか、それとも何かで埋めるのか」。これは単なるプログラミングの問題ではなく、「そのデータをどうビジネスに活かしたいか」という人間側の判断が問われる部分です。エンジニアの腕の見せ所でもあり、データ処理の最も泥臭く、そして最も重要な工程と言えるでしょう。
データがきれいにお掃除されてピカピカになったら、次はいよいよエクセルが得意としていた「集計作業」をpandasでどう行うのかを見ていきます。
エクセルのピボットテーブルをコードで実現!グループごとの強力な集計処理¶
データがきれいになったら、私たちが次にやりたくなるのは「集計」ですよね。全社員の売上の合計を出したり、平均値を見たりするのはもちろんですが、実務で最も要求されるのは「部署ごとの売上合計」や「性別・年代別の平均購買額」といった、特定のグループごとに分類して集計する処理です。
エクセルを使っている方なら、ここで「ピボットテーブルの出番だ!」と思われるでしょう。ピボットテーブルは確かに素晴らしい機能ですが、毎回マウスでドラッグ&ドロップして表の形を整えるのは手間がかかりますし、元データが更新されるたびに作り直すのも面倒です。
pandasには、このピボットテーブルの操作をたった1行のコードで実現してしまう、魔法のような機能が備わっています。それが groupby()(グループバイ)です。この機能を使えば、「データをグループに分けて、それぞれに対して計算を行う」という処理が瞬時に完了します。
たとえば、「部署ごと」の「売上金額の合計」を出したい場合を考えてみましょう。
# 部署ごとにグループ分けし、売上金額の合計(sum)を計算する
dept_sales = df.groupby("部署")["売上金額"].sum()
print(dept_sales)
たったこれだけです。コードを日本語に翻訳して読んでみると、非常に直感的であることがわかります。
1. df.groupby("部署") で、データを部署ごとに切り分けます(営業部グループ、開発部グループ…という風に)。
2. ["売上金額"] で、その中で計算したい項目を指定します。
3. .sum() で、合計を計算するように指示を出します。
この sum() の部分を他の言葉に変えるだけで、様々な集計が一瞬で可能になります。平均を知りたければ mean()、データが何件あるか数えたければ count()、最大値を知りたければ max() に変えるだけです。
# 部署ごとの、売上金額の平均(mean)を計算する
dept_sales_avg = df.groupby("部署")["売上金額"].mean()
# 部署ごとの、所属する社員の人数(count)を計算する
dept_member_count = df.groupby("部署")["社員名"].count()
どうでしょうか。エクセルでピボットテーブルを作り、値フィールドの設定から「合計」を「平均」に変更して…というマウスクリックの作業に比べて、圧倒的にシンプルでスピーディーですよね。
さらに、複数の項目でグループ分けすることも可能です。「部署ごと」かつ「役職ごと」の売上平均を見たい場合は、groupby の括弧の中にリスト形式で複数の名前を指定します。
# 部署と役職の組み合わせごとに、売上金額の平均を計算する
complex_group = df.groupby(["部署", "役職"])["売上金額"].mean()
print(complex_group)
私が実務でデータ分析の依頼を受けた時、まずはこの groupby() を使って様々な切り口からデータを集計し、「どの部署の成績が良いのか」「どの年代の売上が伸びているのか」といった全体的な傾向(インサイト)を掴むことから始めます。大量の無機質な数字の羅列が、意味のある「情報」へと変わる瞬間であり、データ処理の醍醐味を最も感じられる機能の一つです。
集計処理までマスターすれば、あなたはもう立派なpandas使いです。最後に、これまで学んできた技術をすべて組み合わせて、私が現場で実際に書いている「データ前処理の黄金パターン」をお見せしましょう。
【実践編】エンジニア歴10年の私がよく使う、データ処理の黄金パターンと出力¶
ここまで、データの読み込み、抽出、クレンジング(欠損値処理)、そして集計という、pandasの基本機能を一つずつ見てきました。実際の業務では、これらをバラバラに使うのではなく、一連の流れとして組み合わせて使用します。
ここでは総まとめとして、私が10年間の現場経験の中で何度も何度も書いてきた、「汚い生データを読み込み、きれいに整えて集計し、最終的な結果を新しいファイルとして保存する」という一連の黄金パターンをご紹介します。
シナリオとしては、「全国の店舗から送られてきた少し汚い売上データ(sales_raw.csv)を読み込み、欠損値を処理し、東京本社のデータだけを抽出し、店舗ごとの売上合計を計算して、その結果をきれいなCSVファイル(tokyo_sales_summary.csv)として出力する」という一連の作業です。
import pandas as pd
# 1. データの読み込み(文字化け対策のエンコーディング指定を忘れずに)
print("データの読み込みを開始します...")
df = pd.read_csv("sales_raw.csv", encoding="utf-8")
# 2. データの全体把握(実務ではここで様子を見ます)
print(f"読み込んだデータは {df.shape[0]} 行です。")
# 3. データクレンジング(欠損値の処理)
# 売上金額が空欄のデータは計算できないため、思い切って削除する
clean_df = df.dropna(subset=["売上金額"])
# 4. データの抽出(条件による絞り込み)
# エリアが「東京」のデータだけを抽出する
tokyo_df = clean_df[clean_df["エリア"] == "東京"]
# 5. データの集計
# 東京のデータの中で、店舗ごとの売上合計を計算する
# ※ reset_index() をつけることで、集計結果をきれいな表(データフレーム)の形に戻します
summary_df = tokyo_df.groupby("店舗名")["売上金額"].sum().reset_index()
# 6. 結果の確認
print("=== 集計結果 ===")
print(summary_df.head())
# 7. データの保存(新しいCSVファイルとして出力)
# index=False は、pandasが勝手につける行番号(0, 1, 2...)を保存しないための重要なおまじないです
summary_df.to_csv("tokyo_sales_summary.csv", encoding="utf-8", index=False)
print("結果をファイルに保存しました!")
いかがでしょうか。一つ一つのコードはこれまで学んできた基本的なものばかりですが、それらを順番に並べるだけで、立派な「データ処理自動化システム」が完成しました。
このコードを「data_process.py」のような名前で保存しておけば、来月新しい「sales_raw.csv」が送られてきた時、あなたがやるべきことはエクセルを開くことではありません。このPythonコードを1回実行(ポチッと再生)するだけです。数十万行のデータであっても、数秒後には完璧に集計された「tokyo_sales_summary.csv」が出来上がっているはずです。
最後に登場した to_csv() という機能が、加工したデータをファイルに書き出して保存するためのコードです。ここで私が必ずつけるように指導しているのが index=False という設定です。pandasはデータフレームに行番号(インデックス)を自動的につけて管理しているのですが、そのままCSVに出力すると、エクセルで開いた時に謎の連番の列が一番左にできてしまい、少し不格好になってしまいます。これを防ぐための、実務的なちょっとしたテクニックです。
おわりに:エクセルからの卒業、そして次なるステップへ¶
ここまで、長い文章にお付き合いいただき本当にありがとうございました。
今回ご紹介した内容は、pandasが持つ膨大な機能のほんの一部に過ぎません。しかし、この「読み込み」「抽出」「クレンジング」「集計」「保存」という一連のサイクルを理解した時点で、あなたのデータ処理能力は、エクセルのみを使っていた頃と比べて飛躍的に向上しているはずです。
最初にもお話しした通り、プログラミングによるデータ処理の最大の魅力は「圧倒的な処理スピード」と「誰がやっても同じ結果になる再現性」、そして「自動化による時間の創出」です。pandasを使って面倒なデータ集計作業を数秒で終わらせることができるようになれば、あなたは浮いた時間を使って、「このデータが意味するビジネス上の課題は何か?」「次にどんなアクションを起こすべきか?」という、人間本来がやるべきクリエイティブな思考に時間を割くことができるようになります。
もちろん、最初からすべてを完璧に暗記する必要は全くありません。私がエンジニア歴10年になった今でも、毎日のように「pandas 〇〇の方法」とGoogleで検索しながらコードを書いています。大切なのは、「pandasを使えば、こんなことができるんだ」というイメージを頭の中に持っておくことです。
もし、日々の業務で「また同じコピペ作業をしているな」「このエクセルファイル、重すぎて限界だな」と感じる瞬間があったら、ぜひこの記事のことを思い出し、pandasの世界に飛び込んできてください。あなたの退屈なルーティンワークを劇的に変える、強力な相棒になってくれることをお約束します。
さあ、Pythonとpandasの準備はできましたか?次回のデータ処理は、エクセルを開くのではなく、ぜひコードを書いてみてくださいね!