Help us understand the problem. What is going on with this article?

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

More than 1 year has passed since last update.

エラー解決の流れ

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が作成される。

参考文献

kath_y
駆け出したばかりのWebエンジニア / バックエンドからフロントエンドまで幅広く修行中です / 前職で機械学習・データ分析も少し / 使っているもの:JavaScript, TypeScript, Node.js, Vue.js, MySQL, Python / 資格:統計検定2級、JDLA G検定
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away