Pythonのpandasでdictを要素に持つDataFrameをCSV保存し、逆にそれを読み込んでDataFrameに復元するときの注意点の備忘録です
結論としては、dict要素の復元にはその列にast.literal_evalを適用する必要があります。
例
以下のようにdictを要素に含むDataFrameをCSV保存します。
import pandas as pd
# 1. サンプルDataFrameの作成
data = [
{'id': 1, 'info': {'city': 'Tokyo', 'age': 30}},
{'id': 2, 'info': {'city': 'Osaka', 'age': 25}},
]
df = pd.DataFrame(data)
filename = "sample.csv"
df.to_csv(filename, index=False)
出力されたCSVファイルの内容は以下です。
sample.csv
id,info
1,"{'city': 'Tokyo', 'age': 30}"
2,"{'city': 'Osaka', 'age': 26}"
このファイルをまた読み込んでdictの型も復元するにはinfo列の各要素にast.literal_evalを適用する必要があります。
from ast import literal_eval
df_read = pd.read_csv(filename, converters={'info': literal_eval})
assert df_read.equals(df) # 正常終了
余談:失敗例
以下は失敗する例なのですが、ast.literal_evalを適用しない場合は、info列の要素が文字列のままとなります。
df_read = pd.read_csv(filename)
type(df_read['info'][0])
出力
str
別の失敗例として、ast.literal_evalではなくjson.loadsを適用しようとしても正常なJSONではないのでエラーとなります。
import json
df_read = pd.read_csv(filename, converters={'info': json.loads})
出力
JSONDecodeError: Expecting property name enclosed in double quotes: line 1 column 2 (char 1)