astype(int) がうまくいかない
df = pd.DataFrame(data=[["81", "100", "69", "78", "95"],["70", "93", "71", "82", "89"]],columns=["A", "B", "C", "D", "E"])
時々、df.astype(int)を実行しても、dtypeがobjectのままになる。
(大抵、例えば空白や特殊文字が含まれているなど、データが純粋な数字でなく、型変換に失敗しているだけだろうが)
そんなとき、自分は以下3つを試すようにしている。
環境
python = "^3.11"
pandas = "^2.2.2"
ipython = "^8.26.0"
各列ごとに型変換を試す
データフレーム全体を一度に変換するのではなく、各列を個別に変換してみると原因が特定しやすい。以下のような処理を試して、どの列が問題を引き起こしているか確認する。
import pandas as pd
# データフレームの作成
df = pd.DataFrame(data=[["81", "100", "69", "78", "95"], ["70", "93", "71", "82", "89"]],
columns=["A", "B", "C", "D", "E"])
# 各列ごとに整数型へ変換を試みる
for column in df.columns:
try:
df[column] = df[column].astype(int)
except ValueError as e:
print(f"Error in column {column}: {e}")
# データ型を確認
print(df.info())
データのクリーニング
データにスペースや特殊文字が含まれている場合は、これらを取り除くためにクリーニングする。
df = df.apply(lambda x: x.str.strip()) # 余分なスペースを除去
df = df.replace('', pd.NA) # 空文字をNAに置換
df = df.dropna() # NAを含む行を削除
# その後、型変換を再試行
df = df.astype(int)
print(df.info())
Debugging: データの確認
print(df.applymap(lambda x: x.isdigit())) # 数字で構成されているか確認