エラー解決の流れ
PandasのDataframe操作でカラム名(列名)指定をしてデータを抽出しようとしたら、
Key Errorでうまくいかない
⇒Dataframeを確認してその通りに入力してもうまくいかない
⇒カラム名を確認したらカラム名の末尾にスペースが入っていたことが判明
⇒スペースを入れて指定したらKey Error解決
⇒スペースを消して次回も同様のErrorが出ないよう対策
環境・前提
- Python3
- Windows10
- Jupyter Notebookでテスト
- 使用したデータ:日本語のカラム名を含むExcelデータをDataframeに変換したもの
Errorの内容とハマった原因
PandasのDataframe操作で、
df.loc[:,['カラム名']]を指定したときのKey Error
※df: データフレーム名
再現のため、Irisデータセットを使用します。
◇元のデータ
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')
ここで、カラム名の末尾にスペースを入れてみます
# カラム名の末尾にスペースを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通りのカラム名を指定してデータを抽出しようとすると・・・
dfi2.loc[:3, 'sepal length (cm)']
KeyError: 'the label [sepal length (cm)] is not in the [columns]'
Key Errorが返ってきてしまいます( ;∀;)
対処法
カラム名を確認する方法を見つけて、確認してみたら、
末尾にスペースが入っていたことが判明しました。
print(df2.columns) # カラム名の確認
Index(['sepal length (cm) ', 'sepal width (cm) ', 'petal length (cm) ',
'petal width (cm) '],
dtype='object')
そこで、df2.columnsで確認した通りに
末尾にスペースを入れたカラム名を指定してデータを抽出すると・・・
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で開いたときの視認性をよくするために、
改行やスペースが入っていたりして、それが原因でデータ処理の際にエラーが発生することがあります。
カラム名指定の際にいちいちスペースの確認をするのは面倒なので、
あらかじめカラム名のスペースを削除したデータを新しく作成し、
こちらをデータ処理に使用することにしました!
# カラム名のスペースを削除
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')
# 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が作成される。