概要
Pythonのpandasを利用して、CSVファイルの列にあるJSON構造のデータから、指定したものを取り出すコードを実装しました。
サンプルコード
前提として、sample_body
列の中にJSON構造のデータがあるとします。また、その中のデータは以下のようになっています。
{
"information": {
"sample_no": "123456789",
# ...略...
CSVファイルの一番左の列に、新規にsample_no
という列を作成し、それに紐づく123456789
という値を入れるコードが以下です。
pandasライブラリを利用して、DataFrame
の各行からデータを抽出し、その値を新しい列としてDataFrameに追加しています。
import pandas as pd
import json
def get_sample_no(row):
sample_body = json.loads(row['sample_body'])
return sample_body['information']['sample_no']
df_temp = df.apply(get_sample_no, axis=1)
df_temp.name = 'sample_no'
df = pd.concat([df_temp, df], axis=1)
df.to_csv(xxxx_csv_path_xxxx, index=False)
詳細
-
df.apply(get_sample_no, axis=1)
で、DataFrame(=表のようなもの。後述)の各行にget_sample_no
関数を適用します-
axis=1
は、関数を各行に適用、axis=0
だと各列に適用することを意味します - 結果は、
df_temp
という新しいPandas Series(=1列分のデータのようなもの。後述)に格納されます
-
-
pd.concat([df_temp, df], axis=1)
で、concat
関数を使用して、2つのDataFrame(またはSeries)を列方向(axis=1
)に結合しています-
axis=1
の指定により、df_temp
はdf
の左側、つまり新しいDataFrameの最初の列に追加されます。これにより、CSVファイルの一番左の列に新規列を追加することができます。concat
関数は、引数として与えられたリストの順序を保持したまま結合する関数
-
-
df.to_csv(xxxx_csv_path_xxxx, index=False)
で、CSVファイルに出力します-
to_csv
は、DataFrameの内容をCSVファイルとして出力するメソッド。出力するCSVファイルのパス名を指定します。また、index=False
によりDataFrameのインデックス(行ラベル)をCSVファイルに出力しないように指定できます。デフォルトではTrue
なのでインデックスが表示される設定になっています
-
参考
上述のPandas Seriesについて。
pandas でよく使われるデータ構造として1次元の Series(シリーズ)、2次元の DataFrame(データフレーム)があります。
表のようなものが DataFrame 、表の1列分のデータを抜き出したものが Seriesです。
引用元:https://docs.pyq.jp/python/pydata/pandas/series.html
こちらがより詳細に解説されています。
Pandasドキュメントはこちら