csvファイルを変換する必要があったため,備忘録的に書きました。
with文を使ったjsonへの変換もできますが,結論としてはpandasが一番楽だと思います。
環境
- OS:macOS Montery 12.6
- python:3.10.6
- scikit-learn:1.1.2
- pandas:1.4.0
- pyarrow:10.0.1
- fastparquet:2022.12.0
- parquet-cli:1.12.3
また,vscodeの拡張機能を使用して,Jupyterで実験しました。
データセットの用意
scikit-learnに入っているカリフォルニアの住宅価格のデータセットを使用しました。
from sklearn.datasets import fetch_california_housing
import pandas as pd
housing_data = fetch_california_housing()
df_data = pd.DataFrame(housing_data.data, columns=housing_data.feature_names)
df_data.head()
このデータをcsvで保存します。
#DataFrameをcsvとして保存する
csv_file = df_data.to_csv("./data.csv", index=0)
csv->json
import pandas as pd
df_data = pd.read_csv("./data.csv")
#json形式で出力する
df_data.to_json("./data_pd.json", orient="records")
csv->jsonl
import pandas as pd
df_data = pd.read_csv("./data.csv")
#jsonl形式で出力する
df_data.to_json("./data_pd.jsonl", orient="records",lines=True)
csv->parquet
pyarrow
とfastparquet
のinstallが必要です。
import pandas as pd
df_data = pd.read_csv("./data.csv")
#parquet形式で出力する
df_data.to_parquet(path="./data.parquet")
正しく出力されたか確認してみましょう。
今回はparquet-cli
を使いました。
brewからインストールできます。
# parquet-cliのインストール
brew install parquet-cli
$ parquet head data.parquet
おまけ:pyarrowとfastparquetのインストール
※pyarrow
とfastparquet
がinstallされていない場合,to_parquet()
を実行すると以下のエラーが表示されます。
ImportError: Unable to find a usable engine; tried using: 'pyarrow', 'fastparquet'.
A suitable version of pyarrow or fastparquet is required for parquet support.
Trying to import the above resulted in these errors:
- Missing optional dependency 'pyarrow'. pyarrow is required for parquet support. Use pip or conda to install pyarrow.
- Missing optional dependency 'fastparquet'. fastparquet is required for parquet support. Use pip or conda to install fastparquet.
指示に従って,pip
もしくはconda
でインストールしましょう。
私はminiforge
を使用していたので,conda
でインストールしました。
conda install pyarrow fastparquet -y
まとめ
pandasめっちゃ便利。
コマンド2,3行でデータの変換ができちゃいます。
書いた後に気づいたのですが,厳密には全てpd.DataFrameを経由しています。csv->pd.DataFrame->json
が正確な表現ですね。
大きなファイルを変換する場合はread_csv()
でOut of Memory
のエラーが出る場合があります。
他の方法も探してみます。