はじめに
今回は、Pythonでデータ抽出処理を行っている際に遭遇した、TypeError: only integer scalar arrays can be converted to a scalar index
というエラーについて勉強しました。
使用環境は以下のとおりです。
- OS: Windows 10 Pro
- バージョン: 20H2
背景
Pythonでデータフレームから条件に合う行を抽出しようとしたところ、上記のエラーが発生しました。
特に、macOSでは問題なく動作していたコードが、Windows環境ではエラーとなったため、環境依存の影響も疑いました。
実際に行った処理とエラー発生箇所
実際に入力したコード
df[df["C02"] >= 180]
このシンプルな条件抽出のコードで、エラーが発生しました。
試したこと
① astype()で型変換を試みた
エラー内容に「scalar」というワードがあったため、**データ型(型問題)**を疑い、
まずはastype(int)で整数型に変換してみました。
df = df.astype(int, errors='raise')
df[df["C02"] >= 180]
しかし、エラーは解消されませんでした。
また、小数点以下のデータも必要だったため、単純に整数型へ変換する方法は適していませんでした。
② 二重括り([[]])で囲ってみた
次に、列の指定を二重括りで囲む方法を試しました。
df[df[["C02"]] >= 180]
この方法ではエラーは出なくなったものの、
「C02」以外のカラムがすべてNaNになってしまうという別の問題が発生しました。
求めている結果とは異なるため、この方法も断念しました。
③ カラム設定と条件抽出の順番を見直した
さらに、データ加工の手順を見直し、コードの順番を次のように変更しました。
df = df.iloc[26:,]
df = df.astype(float, errors='raise')
df = df[df[1] >= 180]
df_columns = [['C01','C02','C03','C04']]
df.columns = df_columns
ポイントは、カラム名を設定する前に、型変換と条件抽出を済ませたことです。
この順番に変更したところ、無事エラーが発生せずに処理が成功しました。
成功に至ったポイント
ilocでデータを削除した直後は、カラム名が元データの列番号(数値)になるため、
数値インデックス(例:df[1])でアクセスすれば問題なかった。- データの型変換(
astype(float))をカラム名変更前に行ったことで、型の混乱を避けることができた。
つまり、データの加工順序が重要だったということです。
最終的なまとめ
TypeError: only integer scalar arrays can be converted to a scalar indexは、
データフレームの構造やカラム指定ミスが原因で発生しやすい。- データ加工(行削除や型変換)とカラム名の付与は、順番に注意して行う必要がある。
merge()や括り方の問題ではなく、データの内部状態を理解することが解決への近道。
今回はエラー原因を完全には解明できませんでしたが、実際に動かしながら順番を変えることで、回避に成功しました。
今後は、データフレームのインデックスとカラムの取り扱いをもっと深く理解していきたいと思います。
技術書の購入コストを抑えてスキルアップするなら

ここまで読んでいただきありがとうございます。最後に宣伝をさせてください。
プログラミングの技術書や参考書は、1冊3,000円〜5,000円するものも多く、出費がかさみがちです。Kindle Unlimitedであれば、月額980円で500万冊以上の書籍が読み放題となります。
気になる言語の入門書から、アルゴリズム、基本設計の専門書まで、手元のスマホやPCですぐに参照可能です。現在は「30日間の無料体験」や、対象者限定の「3か月499円プラン」なども実施されています。まずはご自身のアカウントでどのようなオファーが表示されるか確認してみてください。
