0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

pandasでdict要素を含むDataFrameをCSV保存・読み込みするときの注意点

Posted at

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)
0
0
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
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?