jsons = [{ "user": { "updatedAt": "2020-04-01", "id": "0001", "name": "taro", "status": { "level": "1", "hp": "100", "atk": "120", }, } }, { "user": { "updatedAt": "2020-04-02", "id": "0002", "name": "hanako", "status": { "level": "2", "hp": "130", "atk": "150", }, } }]
上記のようなjsonデータを用いて、string型の任意のキーのルートを示す値を渡すことで、そのキーに対応するデータをDataFarmeとして出力するように実装したのが下記になります。
def json_to_df(jsons, str_keys): keys= str_keys.split(".") res = [] for json in jsons : for i, key in enumerate(keys): if key in json : json = json [key] else: return None if i >= len(keys) - 1: res.append(json) return pd.DataFrame(res, columns=[keys[-1]])
これを実行すると
res = json_to_df(jsons, "user.name") print(res) # name 0 taro 1 hanako
のように取得できます。
ただ、求めているものは、
res= json_to_df(jsons, ["user.name","user.id","user.status.level"]) print(res) # name id level 0 taro 0001 1 1 hanako 0002 2
のように引数に複数のキールートを指定することで2つ以上のカラムを出力するようしたいです。
強引にfor文を使えばできなくもなさそうですが、2重ループにも3重ループにもなりそうで処理的に無駄が多いような気がしてなりません...
そもそもjson_to_dfのような実装じゃなくて、もっと簡単な手法などがありましたらご教授お願いします。
回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/09/22 07:50