Posted at

【Pythonエラー】Pandas Dataframeカラム名指定でKey Error→カラム名確認して原因特定


エラー解決の流れ

PandasのDataframe操作でカラム名(列名)指定をしてデータを抽出しようとしたら、

Key Errorでうまくいかない

⇒Dataframeを確認してその通りに入力してもうまくいかない

⇒カラム名を確認したらカラム名の末尾にスペースが入っていたことが判明

⇒スペースを入れて指定したらKey Error解決

⇒スペースを消して次回も同様のErrorが出ないよう対策


環境・前提


  • Python3

  • Windows10

  • Jupyter Notebookでテスト

  • 使用したデータ:日本語のカラム名を含むExcelデータをDataframeに変換したもの


Errorの内容とハマった原因

PandasのDataframe操作で、

df.loc[:,['カラム名']]を指定したときのKey Error

※df: データフレーム名

再現のため、Irisデータセットを使用します。

◇元のデータ


python3

from sklearn.datasets import load_iris

iris = load_iris()
df = pd.DataFrame(iris.data, columns=iris.feature_names)
print(df.head(3)) # Dataframeの確認
print(df.columns) # カラム名の確認

【実行結果】

sepal length (cm)
sepal width (cm)
petal length (cm)
petal width (cm)

0
5.1
3.5
1.4
0.2

1
4.9
3.0
1.4
0.2

2
4.7
3.2
1.3
0.2


実行結果

Index(['sepal length (cm)', 'sepal width (cm)', 'petal length (cm)',

'petal width (cm)'],
dtype='object')


ここで、カラム名の末尾にスペースを入れてみます


Python3

# カラム名の末尾にスペースを3つ入れる

df2 = df.rename(columns=lambda s: s.replace(")", ") "))
print(df2.head(3)) # Dataframeの確認

【実行結果】

sepal length (cm)
sepal width (cm)
petal length (cm)
petal width (cm)

0
5.1
3.5
1.4
0.2

1
4.9
3.0
1.4
0.2

2
4.7
3.2
1.3
0.2

ここで注目してほしいのは、

Dataframeの方では末尾のスペースが反映されないということ!

なので、Dataframeでカラム名を確認して、

Dataframe通りのカラム名を指定してデータを抽出しようとすると・・・


Python3

dfi2.loc[:3, 'sepal length (cm)']



実行結果

KeyError: 'the label [sepal length (cm)] is not in the [columns]'


Key Errorが返ってきてしまいます( ;∀;)


対処法

カラム名を確認する方法を見つけて、確認してみたら、

末尾にスペースが入っていたことが判明しました。


Python3

print(df2.columns) # カラム名の確認



実行結果

Index(['sepal length (cm)   ', 'sepal width (cm)   ', 'petal length (cm)   ',

'petal width (cm) '],
dtype='object')

そこで、df2.columnsで確認した通りに

末尾にスペースを入れたカラム名を指定してデータを抽出すると・・・


Python3

dfi2.loc[:3, 'sepal length (cm)   ']



実行結果

0    5.1

1 4.9
2 4.7
3 4.6
Name: sepal length (cm) , dtype: float64

無事抽出することができました☆


今後の対策

仕事で使うExcelやCSVのデータは、Excelで開いたときの視認性をよくするために、

改行やスペースが入っていたりして、それが原因でデータ処理の際にエラーが発生することがあります。

カラム名指定の際にいちいちスペースの確認をするのは面倒なので、

あらかじめカラム名のスペースを削除したデータを新しく作成し、

こちらをデータ処理に使用することにしました!


Python3

# カラム名のスペースを削除

df3 = df2.rename(columns=lambda s: s.replace(" ",""))
print(df3.columns)


実行結果

Index(['sepal length (cm)', 'sepal width (cm)', 'petal length (cm)',

'petal width (cm)'],
dtype='object')


Python3

# df3をCSV形式で出力

df3.to_csv("./iris.csv", encoding='shift-JIS',index=False)
# オプションについて
# encoding='shift-JIS' → 元のデータは日本語を含むのでshift-JISでエンコーディング
# index=False → 開始列の0,1,2...を出力しない

【実行結果】

Pythonファイルと同じフォルダに、iris.csvが作成される。


参考文献