1. ホーム
  2. python

[解決済み] PandasのDataFrameはリストを文字列として格納しています。リストへの変換方法

2022-10-20 21:24:18

質問

私は n -によって m Pandasデータフレーム df は以下のように定義されています。(これが最善の方法でないことは分かっています。しかし、それはこの記事のTMIになるので、このアプローチが私の特定のシナリオで動作するという私の言葉を受け止めてください)。

>>> df = DataFrame(columns=['col1'])
>>> df.append(Series([None]), ignore_index=True)
>>> df
Empty DataFrame
Columns: [col1]
Index: []

このDataFrameのセルに、以下のようにリストを格納しています。

>>> df['column1'][0] = [1.23, 2.34]
>>> df
     col1
0  [1, 2]

何らかの理由で、DataFrameはこのリストをリストではなく文字列として保存しました。

>>> df['column1'][0]
'[1.23, 2.34]'

2点ほど質問させてください。

  1. なぜDataFrameはリストを文字列として保存するのですか?また、この動作を回避する方法はありますか?
  2. もしそうでないなら、この文字列をリストに変換するPythonicな方法はありますか?

更新

使用していたDataFrameは、CSV形式で保存・読み込みを行っていました。 この形式は、DataFrame 自体ではなく、リストを文字列からリテラルに変換していました。

どのように解決するのですか?

ご指摘の通り、この現象はpandasのDataFrameの保存と読み込みを .csv ファイルとして保存し、読み込むときによく起こります。

この場合、リストオブジェクトが文字列表現を持っているため、リストオブジェクトを .csv ファイルとして保存できるためです。を読み込むと .csv を読み込むと、その文字列表現が得られます。

実際のオブジェクトを保存したい場合は DataFrame.to_pickle() (を使います(注意:オブジェクトはpicklableでなければなりません!)。

2番目の質問に対する答えですが、これを変換して戻すには ast.literal_eval :

>>> from ast import literal_eval
>>> literal_eval('[1.23, 2.34]')
[1.23, 2.34]