15
17

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Posted at

エラー解決の流れ

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

参考文献

15
17
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
15
17

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?