質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

3回答

968閲覧

Python でJSONで取り込んだデータを加工したい

STSW

総合スコア6

JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2020/03/29 13:46

編集2020/03/29 15:01

前提・実現したいこと

Python でJSONで取り込んだデータを加工して表示したいと思っています。

JSONフォーマットは、
{"A":"aa1","B":bb1,"C":cc1"}
{"A":"aa1","B":bb2,"C":cc2"}
{"A":"aa2","B":bb1,"C":cc3"}
{"A":"aa1","B":bb2,"C":cc4"}
{"A":"aa3","B":bb1,"C":cc5"}
です。
要素Aと要素Bはそれぞれ値が重複する場合があります。

ここから、例えば、①A=aa1の要素のみを抽出し、
{"A":"aa1","B":bb1,"C":cc1"}
{"A":"aa1","B":bb2,"C":cc2"}
{"A":"aa1","B":bb2,"C":cc4"}
を対象として、
②文字列のB要素、bb1, bb2の数をカウントしたい。
③数値のC要素の最大、最小値を求めたい。
です。

さらに、④同様にA=aa2, aa3要素も同様のことを繰り返したいです。
(A要素のすべての種類に対して)

発生している問題・エラーメッセージ

これを読み込んで、A、B、Cをそれぞれlist化するところまではできました。
A_lists = [aa1, aa1, aa2, aa1, aa3]

これを連結させて、なんとか処理しようと
Webを漁りまくってサンプルコードや使い方を探しました。
np.whereや、np.arrayを使って実現しようと思いましたが、
どうもうまくいきません。。

Python がお得意な方、解決に至るような是非サンプルコードをいただけると助かります。
もう1日以上、これにはまってしまい、私の知識では限界です。。

よろしくお願いいたします。

エラーメッセージ

該当のソースコード

All_lists = A_lists, B_lists, C_lists

np_All_lists=np.array(All_lists)
new_All_lists=np.where(np_All_lists[0, :] == Aのある値)

みたいなことをして、なんとか①をまずは対応しようとしていました。

試したこと

上記の通りです。

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

pandas を使って下記のようにDataFrame(テーブル形式のデータ)に変換した上で処理するのが簡単かと

Python

1import pandas as pd 2 3data = """ 4{"A":"aa1","B":"bb1","C":"cc1"} 5{"A":"aa1","B":"bb2","C":"cc2"} 6{"A":"aa2","B":"bb1","C":"cc3"} 7{"A":"aa1","B":"bb2","C":"cc4"} 8{"A":"aa3","B":"bb1","C":"cc5"} 9""" 10df = pd.read_json(data, lines=True) 11print(df) 12# A B C 13#0 aa1 bb1 cc1 14#1 aa1 bb2 cc2 15#2 aa2 bb1 cc3 16#3 aa1 bb2 cc4 17#4 aa3 bb1 cc5

あとはDataFrame上で

①A=aa1の要素のみを抽出し

Python

1target_df = df.loc[df['A']=='aa1'] 2print(target_df) 3# A B C 4#0 aa1 bb1 cc1 5#1 aa1 bb2 cc2 6#3 aa1 bb2 cc4

②文字列のB要素、bb1, bb2の数をカウントしたい。

Python

1ret = target_df['B'].value_counts() 2print(ret) 3#bb2 2 4#bb1 1 5#Name: B, dtype: int64

③数値のC要素の最大、最小値を求めたい。

Python

1# ccのあとの数値部を抜き出し 2num = target_df['C'].str.extract('cc(\d+)')[0].astype(int) 3# 数値の最小値と最大値を表示 4print(num.min(), num.max()) 5# 1 4

のように比較的簡単に処理できます。

④同様にA=aa2, aa3要素も同様のことを繰り返したいです。

の処理に関しては df.groupby('A') にて Aの値毎に上記の処理を施すとよいかと思います。

これらの結果をどのように使用するのかが不明なのですが、とりあえず Aの値ごとの Bの各要素の数、Cの数値部の最小・最大を求めるコードを書いてみましたので参考にしてください。

Python

1import pandas as pd 2 3data = """ 4{"A":"aa1","B":"bb1","C":"cc1"} 5{"A":"aa1","B":"bb2","C":"cc2"} 6{"A":"aa2","B":"bb1","C":"cc3"} 7{"A":"aa1","B":"bb2","C":"cc4"} 8{"A":"aa3","B":"bb1","C":"cc5"} 9""" 10df = pd.read_json(data, lines=True) 11df['NUM_C'] = df['C'].str.extract('cc(\d+)')[0].astype(int) 12r1 = df.groupby('A')['B'].apply(lambda d: d.value_counts()).unstack() 13r2 = df.groupby('A')['NUM_C'].apply(lambda d: pd.Series([d.min(), d.max()], index=['c_min', 'c_min'])).unstack() 14ret = pd.concat([r1,r2], axis=1) 15print(ret) 16# bb1 bb2 c_min c_min 17#A 18#aa1 1.0 2.0 1 4 19#aa2 1.0 NaN 3 3 20#aa3 1.0 NaN 5 5

投稿2020/03/30 01:35

magichan

総合スコア15898

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

STSW

2020/03/30 11:05

ありがとうございます。非常な丁寧な回答に感謝いたします。 どれも今後の参考になりそうで、助かります。 こちらをBAとも考えたのですが、早くご回答をいただけて解決のきっかけになったものをBAとさせていただきました。申し訳ございません。 ちなみに、dataを取り込むときは、直接値入力ではなく、 ***.jsonファイルを読み込むときはどうすればいいのでしょうか?
guest

0

各キーのValueがリスト化できるのなら、データをオブジェクトとしてそのままリストに入れればいいような気がしますが…
以下のような形式でJsonデータを書き直すことはできますか?

{ "data": [{"A":"aa1","B":"bb1","C":"aa1"},{"A":"aa1","B":"bb1","C":"aa1"},{"A":"aa1","B":"bb1","C":"aa1"} ...]}

この形式であれば以下のようにすれば質問者様のやりたいことは実現できるように思います。

python

1import json 2str = '{ "data": [{"A":"aa1","B":"bb1","C":1},{"A":"aa1","B":"bb2","C":2},{"A":"aa1","B":"bb2","C":3}]}' 3b_counts_dict = {} 4c_list = [] 5data = json.loads(str) 6 7def get_list_byA(a): 8 for d in data["data"]: 9 # dに各要素がdict形式で入る 10 if (d["A"] == a): 11 if (d["B"] in b_counts_dict): 12 b_counts_dict[d["B"]] += 1 13 else: 14 b_counts_dict[d["B"]] = 1 15 c_list.append(d["C"]) 16 17# Aがaa1のものをカウント 18get_list_byA("aa1") 19 20# Cの最大値、最小値 21print("max_c: ", max(c_list)) 22print("min_c: ", min(c_list)) 23 24# 各要素の数 25print(b_counts_dict) 26 27# 実行結果 28max_c: 3 29min_c: 1 30{'bb1': 1, 'bb2': 2}

ただしこの例だと、例えばforループ内でget_list_byAを呼び出すとAの値によってB要素の数のカウントを分ける、ということができません。
もしAの値によってBの要素の数のリストを分けたいのであれば、Key名がAの値でValueにc_listb_counts_dictを持つdictを作ってそこに格納するなりしてください。

データの数が多いならpandasとか使うのがいいかもしれません。
あとデータのKeyが不変なのであれば、データを独自クラスにシリアライズして処理するのもありだと思います。
https://qiita.com/Thiru0000/items/35554f523565e4b12b51

投稿2020/03/29 15:43

ShintaroNomiya

総合スコア94

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

STSW

2020/03/30 10:55

ありがとうございます。 JSON形式を現時点では変えることができないのですが、他の部分が参考になりました。
guest

0

ベストアンサー

素直に回答すると、"aa1"である要素を取り出すためには以下のようにすればできます。

Python

1index_list = [] 2idx = -1 3for i in range(A_lists.count('aa1')): 4 idx = A_lists.index('aa1', idx + 1) 5 index_list.append(idx) 6

このループの中でindex_listにappend(リストに要素を追加)しているところで
A_lists、B_lists、C_listsとかからそれぞれ新しいリストに抽出していけば①はできます。

あと、一度リストにしてまた戻す形になるので、
pandasというライブラリの中にあるDataFrameを使うともっとすっきりとまとまるかと思います。
が、多少扱いが難しいので、一旦リストでやってみて余裕ができれば試してみるとよいと思います。

投稿2020/03/29 15:28

Matsui_hero

総合スコア346

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

STSW

2020/03/30 10:57

ありがとうございます。 countをきっかけに、enumerateを知り、これを使って同じようなことができました。 他の方のご意見も参考になったのですが、最初に解決のきっかけを与えてくれたこちらをBAとさせていただきます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問