pandasのpivot_tableで集計できない原因と対処法を試した話(DataErrorの直し方)

経理の月次報告でExcelピボットを使っていました。最近Pythonを覚えたのでpivot_tableに挑戦したのです。ところが、コードを実行した瞬間に問題が起きました。画面が真っ赤なエラーで埋め尽くされたのです。自分もExcelと同じ感覚で書いて失敗しました。pandas固有のルールに何度も引っかかったのです。特にデータ型と集計関数の初期設定で詰まりました。初心者が必ず躓くポイントだと痛感させられました。

今回の記事では、私の失敗談と解決策を共有します。1時間以上も頭を抱えたエラーの解消法をまとめました。同じように作業が止まっている方の助けになれば幸いです。エラーの原因を切り分けることが重要と言えるでしょう。それだけで作業効率は劇的に改善するはずです。

私が実際に直面した失敗例をもとに解説を行います。具体的な対処法を順番に見ていきましょう。Pythonでのデータ集計の自動化は大変便利です。この記事がエラー解消のヒントになることを願っています。

pandas集計、文字列指定の罠

最初は単純な売上データの集計を試みました。Excelならマウス操作だけで簡単に計算できます。商品名ごとの売上合計がすぐに出せるのです。Pythonでも同じように動くはずだと信じていました。ところが実行すると冷たい文字が表示されます。DataErrorという見慣れないエラーでした。メッセージの意味が分からずコードを見直します。しかし何度実行しても結果は変わりません。集計表どころか1行のデータも出ませんでした。

Excel感覚が落とし穴!pandas文字列エラー解決記

月次売上データをExcelと同じ感覚で処理しました。するとDataErrorが出て1時間悩んだのです。valuesに文字列列を指定したのが原因と言えます。数値列に変えたらすぐに解決しました。実はvalues引数に「商品名」を指定していました。これは文字列の列なので注意が必要です。Excelなら自動で件数を数えてくれるでしょう。しかしpandasのデフォルトは平均値の計算です。文字の平均は出せないと怒られてしまったのです。慌ててドキュメントを読み込みました。そこで自分の指定ミスにようやく気づいたのです。

エラー解決までに1時間以上かかってしまいました。プログラムは空気を読んでくれないと悟りました。まずはエラーの正体を知ることが近道になります。当時はその事実に気づくまでに時間を浪費しました。

データ集計エラー4つの原因と解決法

自分が詰まった原因を整理したら、4パターンに絞られました。1つ目は指定した列に数値が入っていないケースでした。2つ目はデータ型に関するエラーの問題でしょう。数字に見えてもプログラム上では文字の扱いです。3つ目は集計方法の指定が適切でない場合です。これもエラーや意図しない結果を招く原因となります。最後はデータ構造上の問題が考えられるでしょう。行と列の組み合わせに該当データが存在しない状態です。

日本語インターフェースのJupyter Notebook上で、真っ赤なエラーが表

自分がどのパターンに該当するか切り分けましょう。まずはエラーメッセージをしっかり読み込みます。次にデータの型を確認する習慣をつけてください。初心者のうちは解決の糸口が見つかりにくいものです。本記事では各症状と解消手順を順番に解説します。原因を整理して一つずつ潰していくことが大切と言えるでしょう。そうすれば必ず正しい集計結果にたどり着けるはずです。最も遭遇しやすい文字列指定のミスから見ていきましょう。この基本を押さえるだけでエラーの8割は防げます。

ここで一度立ち止まって考えてみてください

Pythonや自動化スキルを体系的に習得して、ITエンジニアとしてのキャリアを切り開きたい方には「Enjoy Tech!(エンジョイテック)」が選択肢のひとつです。現役エンジニアのサポートで、未経験から実践的なスキルを身につけられます。

プログラミングスクール Enjoy Tech!(エンジョイテック) →

集計の落とし穴:valuesとデータ型

第1パターンはvaluesに文字列を指定するミスです。これがDataErrorを発生させる最大の要因です。例えば売上金額を合計したい場面を想像してください。誤って担当者名をvaluesに入れてしまう状況です。pandasは名前の平均値を出すよう命令を受け取ります。しかし文字データの平均を計算することは不可能でしょう。集計できる数値型がないというエラーが返ってきます。

エラーコードと正常コードの違いはたった1カ所でした。解決策はvaluesに必ず数値列を指定することです。売上や数量といった計算可能な列を選びましょう。文字の件数を数えたい場合は設定変更が必要です。後述するaggfuncの値を適切に変更してください。自分では数値列を指定したつもりでも注意がいります。列名が1文字違っているケースも少なくありません。全角と半角が混ざっていることもよくあります。指定列名がデータ内に存在するか再確認しましょう。計算したい数値が入った列を入れるのが鉄則です。しかし数値列を指定してもエラーが消えない時があります。

それが次に説明するデータ型の問題と言えるでしょう。見た目は数字なのに計算できない不思議な現象です。この型チェックこそがPython集計の肝と言えます。

object型データの確認と変換

第2パターンは列のデータ型がobject型の場合です。つまりデータが文字列として扱われている状態になります。CSVファイルを読み込んだ際に起きやすい現象と言えるでしょう。数字の列に空欄や特殊文字が混ざっていると起こります。pandasはその列全体を文字と判断してしまうのです。見た目が1000という数字でも中身は文字となります。プログラム内部では「あ」と同じ扱いになるでしょう。この状態で実行すると集計対象が見つかりません。結果としてやはりエラーが出てしまうのです。

データ型と数値変換の鉄則

空のDataFrameが返ってきた場面がありました。列のデータ型がobjectのままでmeanが計算できなかったのです。数値だと思い込んでいました。dtypesを確認するまで原因に全く気づけませんでした。集計前にdf.dtypesを実行して確認してください。対象列がint型やfloat型になっているか見ます。もしobject型の場合は変換処理が必要になります。pd.to_numericを使って数値に変換しましょう。

日本語の文字が含まれるExcelファイルから読み込んだデータフレームの、dtyp

変換時にエラーが出る場合はデータの不備が原因です。未定やハイフンなど数値化できない文字のサインと言えます。引数にerrors=’coerce’を指定しましょう。不正な値を強制的に空欄にするなどの工夫が必要です。データの型を正しく整えることが自動化の第一歩となります。

集計関数aggfuncの活用と注意点

第3パターンは集計関数の仕組みの理解不足と言えるでしょう。aggfuncは未指定だとmeanが適用される仕様になります。つまり自動的に平均値が計算されてしまうのです。平均が出せないデータではエラーや空の結果になるでしょう。アンケートの満足度などを集計したい場合を考えます。このような文字列のデータで平均は計算できません。しかし満足が何人いるかを知りたい場面は多いです。この場合はaggfuncにcountを指定してください。

VS Codeの編集画面で、aggfuncにリスト形式でsumとmeanを指定し

用途に合わせて明示的に書く癖をつけておきましょう。合計ならsumで件数ならcountを指定します。辞書形式で書けば列ごとに異なる集計も可能となります。古い解説サイトの非推奨な書き方には注意してください。最新のpandasのルールに従って記述しましょう。それが将来的なエラーを未然に防ぐ鍵となります。集計方法を正しく伝えれば意図通りに動くはずです。しかし設定は完璧でも結果がスカスカな時もあるでしょう。それが次に解説するデータの組み合わせの問題です。

データ欠損と表示の確認

第4パターンは指定条件のデータが存在しないケースです。縦軸と横軸の組み合わせに一致するデータがない状態になります。pivot_tableはクロス集計を行うための機能と言えるでしょう。縦と横の条件が重なる場所の値を計算してくれます。例えば縦軸に支店名で横軸に商品名を指定したと仮定しましょう。A支店で商品Bが一度も売れていない場合を考えます。その交差点には計算すべきデータが一つもありません。結果にはNaNという欠損値が表示されてしまいます。設定によっては行ごと消えてしまうこともあるでしょう。

出力されたデータフレームの特定のセルが、NaNというグレーの文字で埋め尽くされて

データ不在の原因と確認方法

まず元データに組み合わせが実際に存在するか確かめましょう。フィルタリングの条件が厳しすぎることもあるでしょう。対象データがゼロになっている単純なミスも多いです。データはあるはずなのに表示されない時は要注意です。文字の末尾に余計なスペースが入っているかもしれません。スペースの有無で全くの別物として扱われるからです。データの値そのものに不備があると解決しません。いくらコードを直しても正しい結果は得られないのです。対象データを事前にプリントして内容を確認しましょう。肉眼でチェックする工程も非常に有効な手段となります。

次はそれでも解決しない場合に確認すべきポイントです。この確認作業こそが最も確実なデバッグ方法と言えるでしょう。

計算エラー解決!急がば回れ3つの確認術

対処法を試しても空の結果が返ってくることがあります。その場合は深呼吸して次の3つの手順を試してください。1つ目はdf.dtypesによる型確認の徹底です。計算エラーの8割以上はこの型不一致が原因と言えるでしょう。2つ目は対象列にどんな値が入っているかの確認になります。unique関数を使って一覧表示させてみましょう。予想外の記号や空文字が混ざっていることに気づけます。

対象の列が数値だと思い込んで計算を回しました。実はデータの末尾に1箇所だけ全角スペースが混じっていたのです。それが原因で列全体が文字列扱いになりました。集計結果がすべて空欄になったのです。原因特定に3時間も費やしてしまいました。元データのクレンジングが必要だと気づいたときは膝から崩れ落ちました。3つ目の手順としてdf.shapeを使ってみましょう。これでデータの行数をしっかりチェックしてください。前工程のデータ抽出で条件を間違えることもあります。そもそも0行の空データを集計しようとしていたオチです。

地道な確認が最速のデバッグ

unique()で確認したら予想以上の種類が出てきました。これらの確認は地味で時間がかかる作業と言えるでしょう。そのためつい省略したくなる気持ちも理解できます。しかし急がば回れの精神で丁寧に確認してください。それが結果的に最短でエラーを直す方法になります。現状を正しく把握するデバッグ作業は非常に重要です。

集計表の見栄え改善と効率化

集計が成功しても表がNaNだらけでは見栄えが悪いです。上司に提出するレポートとしては不十分と言えます。そこでfill_valueというパラメータを活用しましょう。データがない部分を0などの数値で埋めることができます。文字列の列をカウントしたい場合も簡単です。aggfuncにcountを指定するだけで解決できるでしょう。Excelのデータの個数と同じ結果が得られます。これらを組み合わせれば綺麗な集計表が完成するでしょう。

日本語の支店名と商品名が並ぶピボットテーブルです。NaNがすべて0に置き換わり、

私も最初はNaNを手動で修正して時間を無駄にしました。この引数を知ってからは一瞬で作業が終わるのです。observed=Trueの指定も非常に便利な設定と言えるでしょう。不要な行が表示されるのを防いでくれます。カテゴリ型のデータがよりスッキリした見た目になるでしょう。最初から完璧な表を目指すとコードが複雑になります。エラーの原因が特定しにくくなるので注意しましょう。まずはシンプルな集計を成功させることが大切です。その後に見栄えを整える順番で進めるのがおすすめです。少しずつ機能を追加して業務効率を上げていきましょう。

手作業で何時間もかけていた集計が数秒で終わります。その快感をぜひ実際に味わってみてください。

無料プレゼント

Excel業務を自動化する前に確認するチェックリスト(PDF)

自動化していい作業かどうか、VBAかPythonか、最初に避けるべき落とし穴。実務でよく迷うポイントを1枚にまとめました。メールアドレスだけで受け取れます。

無料でチェックリストを受け取る

¥980 ミニキット

コピペで動かせる3スクリプト+自動化チェックリスト

最新ファイルの自動選択・部署名ゆれの正規化・CSV文字コード確認の3本セット。今週の作業を1つだけ楽にするための最小キットです。

ミニキットを見る(¥980)

関連リンクとチェックリスト

関連書籍

Python・pandas関連書籍を、手元で見返せる形にしておきたい場合

pandasのエラー対応は、似た症状を何度も見返すことが多いです。データ前処理や型変換を手元で確認できる本を1冊置いておくと、調べ直しの時間を減らしやすいです。

Python・pandas関連書籍をAmazonで探す

学習サービスとアンケート

このスキルを活かしてさらに前へ進むなら

PythonやExcel自動化スキルを持ったまま、ITエンジニアとして転職したい方には「EBAエデュケーション」が選択肢です。企業が求めるエンジニア像に合わせたカリキュラムで、実務直結のスキルを習得できます。

ITエンジニア転職・EBAエデュケーション →

[アンケート] この記事は役に立ちましたか?


1問だけ回答する