Pythonエラー/警告対策を知りたい

全般

Python,Pandas等のコーディング時に発生するエラー、ウォーニングの対策集です。ウォーニングも何か止まるわけではありませんし一見うまく動いているように見えますが放置しておくと挙動がおかしくなってきますので、早めに改善していくことが大切です。

目次

エラー

could not convert string to float

ファイルを読み込む際に出るエラー
一度データをテキストで開くとCSV形式になっているかを確認するとよいと思います

Data must be 1-dimensional

1次元のデータを処理しようとしてるのに………。っていってます(笑)。
concatなんかを使ってるのにデータフレームを代入しようとしてませんか?
そんな時に多いのがこのエラーです。

expected an indented block

不適切なインデント及びスペースが存在しているときに発生。削除すると消えますが、Pythonはインデントを一つ開ける必要があるためなかなか最初は難しいものですよね。開発者がおのおの異なるコーディングをしないために規約があるのです。

GraphViz’s executables not found

「pydotplus」をインストール

‘int’ object is not iterable

繰り返しに使えないオブジェクトを使っているというエラーで、初心者がfor文に突っ込んで出ているケースが多いです。

KeyError

KeyErrorとは例外の一つです。データを参照した際に指定した位置にキーがないと発生するエラーと思ってください。Pandasの時のmergeをする際に出たりしますが、カラム名が一致してないときによく出てきます。合わせたつもりでもあってないケースが散見されるので、もう一度チェックしてみては?

name ‘pd’ is not defined

これはライブラリのインポートを忘れている、もしくは間違っている可能性大です。import名とは別名を付けている場合もこのエラーが発生します。

‘NoneType’ object has no attribute ‘append’

これはappend()関数を使ったときによく出てきます。

for i in range(2,ws_cd.max_row) :
    if ws_cd.cell(i,1).value != ws_cd.cell(i-1,1).value:

        bui_cd = bui_cd.append(ws_cd.cell(i,1).value)

これってappend()関数は直接代入となるので下記の書き方となります。

for i in range(2,ws_cd.max_row) :
    if ws_cd.cell(i,1).value != ws_cd.cell(i-1,1).value:

        bui_cd.append(ws_cd.cell(i,1).value)

奥が深いですね~

Property ‘CreateItem.subject’ can not be set.

すいませんが、解析中です(笑)。Outlookのメールを作成するコードを実行した際に発生したのですが、outlookを起動してから実行するとこのエラーは出ませんでした。

Reindexing only valid with uniquely valued Index objects

  • 解説
    Indexが重複している際に発生するエラーです。
df1 = pd.DataFrame([[200,100],[3000,4]], index =['愛知','大阪'], columns=['売上','仕入れ個数'])
df2 = pd.DataFrame([[1000,500],[200,30]], index =['東京','東京'], columns=['売上','仕入れ個数']) 
pd.concat([df1, df2], axis=1)
  • 対策
    上記でいうと東京が重複していますね。コーディングする過程でIndexが重複することがたまにあるかとは思いますが、見つけ出してつぶすことでエラーを消去できます。
    DataFrame.columnsでカラム名を表示することができるので重複しているカラム名をさがしましょう。カラム名を変更する手法はこちらに記載していますので参考にしてくださいね。

Row or column values must be at least 1

  • 解説
    このエラーは単純で最低でも1を入れてくださいという英語そのままです。たとえば、エクセルのセルの(0,0)を取得しようと思っても出来ないので、1以上にしてくださいということを表していますよ。
  • 対策
    原因がわかれば、0で指定できないセル(数値)を1にするために ⁺1を加えるだけですよ (笑)

Shape of passed values is (x, y), indices imply (a, b)

  • 解説
    Concatで結合した時によく出るエラーです。Index、Columnの数が異なるから出ているエラーということは何となく理解できますよね。DataFrameのIndex値が重複している場合に発生するエラーのようと解説されています。
df1 = pd.DataFrame([[200,100],[3000,4]], index =['売上','仕入れ個数'])
df2 = pd.DataFrame([[1000,500],[200,30]], index =['売上','売上']) 
pd.concat([df1, df2], axis=1)
  • 対策
    Index値の重複を消去するとエラーが消えます。

single positional indexer is out-of-bounds

DataFrameが空だとこのようなエラーが発生します。
また、想定より大きな値がいずれかのインデックスの数字に入ってしまっているか、想定より小さい可能性もあります。for文で処理しようとしたときにDataFrameが持っている列数を超える範囲を指定している等がありがちなミスです。
for i in range(len(df1.axes[0])-1):
上記のように1少ないところまで処理することで解決できることが多いエラーです

‘str’ object has no attribute ‘str’

モデルのバージョンが古い際に発生する不具合

‘utf-8’ codec can’t decode byte 0x89 in position 1: invalid start byte

csvファイルを読み込んだ際に出るエラーです。文字コードを文字に変換する際に出るエラーです。
unicodeは世界規格なのですが完全にできているわけではないので、データによってはエラーが発生する場合があります。このため

df = pd.read_csv('data.csv', encoding='shift_jis')

encodingを指定してやれば解決することが多いです。
上記のコードで試してみてくださいね。

Unsupported format, or corrupt file: Expected BOF record

  • 解説
    Pandas等で読み込んだ際に「できないよ~」っていってます。読み込めないファイルをしていしているのですが、glob関数を使ってファイル全体を読み込もうとしている際によく発生するエラーとなります。
  • 対策
    エラーファイルを消去する
# 対象ファイルを下記コードで削除する
del "file.xlsx"

‘<‘ not supported between instances of ‘str’ and ‘int’

str型とint型では<演算をサポートしていません。という意味ですね。すなわち、strとintでは比較できないですよということです。どちらかが文字列で読み取れていると思います。

‘例外が発生しました。’添付ファイルを保存できません。 この操作を行うために必要なアクセス権がありません。

PythonでOutlookの添付資料を保存しようとした際に出現するエラーです。
詳細説明作成中です………。

‘RPC サーバーを利用できません。’, None, None)

PythonでOutlookの添付資料を保存しようとした際に出現するエラーです。
詳細説明作成中です………。

ウォーニング(警告)
SettingWithCopyWarning

loc[row_indexer,col_indexer] = value instead

これはPandasでlocやilocを使用する際に発生しやすいウォーニングです。DataFrameのスライスしたものを参照したいのかコピーしたいのか不明なのでエラーがでています。
このときは参照ではなくコピーである旨をはっきり明示するとエラーが解消されることが多いので、
「.copy」をつけてあげましょう。

dff = pd.DataFrame()
for i in range(len(df1.axes[0])):
     if df1.iloc[i,3] <202003 :
            df2= df1.iloc[i:i+1].copy()
            df2["年度"] = 19
            dff = pd.concat([dff, df2],axis=0)

私のコーディングでは9割がこれでなおります。

コメント

  1. yui より:

    エラーが出るたびにググってるのでこのまとめはとても参考になります!
    質問ですが、python以外の言語は何を使用していますか?

    • GengMakMaak より:

      いつもHP訪問ありがとうございます。実は本格的に勉強し始めたのはPythonが初なんです・・。これからもよろしくお願いします。

タイトルとURLをコピーしました