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

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

新規登録して質問してみよう
ただいま回答率
85.50%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

pandas

Pandasは、PythonでRにおけるデータフレームに似た型を持たせることができるライブラリです。 行列計算の負担が大幅に軽減されるため、Rで行っていた集計作業をPythonでも比較的簡単に行えます。 データ構造を変更したりデータ分析したりするときにも便利です。

Q&A

解決済

1回答

5962閲覧

jsonファイルを読み込んで、重複削除を行う:Pandas

pepasuke623

総合スコア55

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

pandas

Pandasは、PythonでRにおけるデータフレームに似た型を持たせることができるライブラリです。 行列計算の負担が大幅に軽減されるため、Rで行っていた集計作業をPythonでも比較的簡単に行えます。 データ構造を変更したりデータ分析したりするときにも便利です。

0グッド

0クリップ

投稿2017/05/25 14:47

編集2017/05/25 14:48

###前提・実現したいこと
お世話になります。
jsonファイルを読み込んでデータフレームに代入して、重複削除をしたいと思っています。

ディレクトリの中には、次のようなjsonファイルが沢山あります。

// 0001.json {"machine":"A3","times":1494824607024}

"machine"は稼働した機械の名称。"times"にはその時の時間がUNIX時間で入っています。
システムの都合上(謎の仕様上)、ファイル名が違うのに、同じ機械名称と同じ時間が混じってしまいます。なのでファイルを連結した際に重複データを削除したいと思っています。

###試したこと・該当のソースコード・エラーメッセージ
以下のように書いてみました。

Python

1import pandas as pd 2import glob 3 4files = glob.glob('2A/*.json') 5df_dic = pd.concat( 6(pd.read_json(f) 7for f in files)).sort_values(by=["time"], ascending=True) 8 9# 無理やりデータフレームに変換してみた 10df= pd.DataFrame.from_dict(df_dic) 11 12print(df.drop_duplicates())

これを動かすと次のようなメッセージが出てきます。

File "pandas\src\hashtable_class_helper.pxi", line 843, in pandas.hashtable.PyObjectHashTable.get_labels (pandas\hashtable.c:15447) TypeError: unhashable type: 'dict'

jsonファイルを読み込んで重複削除を行うにはどうしたら良いのでしょうか?ネットを調べてもそれらしい情報を見つけられなかったので質問させていただきました。
お手数ですがご教示願います。

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

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

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

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

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

guest

回答1

0

ベストアンサー

Pandas.read_json() が上手く動作しないというのであれば、
素直に 標準ライブラリのjsonを使用してみてはいかがでしょうか。

Python

1import pandas as pd 2import json 3import glob 4 5files = glob.glob('2A/*.json') 6df = pd.DataFrame() 7for i,file in enumerate(files): 8 with open(file) as f: 9 data = json.load(f) 10 for key in data.keys(): 11 df.loc[i,key] = data[key] 12df = df.drop_duplicates().reset_index(drop=True)

【追記】

'machine'データがリストだった場合の暫定対策

Python

1 for key in data.keys(): 2 # 'machine'データが文字列以外のときは無視する処理 3 if key=='machine' and type(data[key])!=str: 4 continue 5 df.loc[i,key] = data[key]

投稿2017/05/25 23:45

編集2017/05/26 04:46
magichan

総合スコア15898

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

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

pepasuke623

2017/05/26 01:41

素早い回答感謝いたします! 試してみましたが, Must have equal len keys and value when setting with an iterable というエラーが出たので for key in data.keys(): の真下に df = df.astype('object') を入れて無理やりオブジェクト化したところ, unhashable type: 'list' と以前と同じようなエラーが出てきます(TT)
magichan

2017/05/26 02:29

質問に書かれているようなJSONファイルを複数個準備して動作させても問題なく動作しております。 なにか仕様の違うJSONデータが紛れているということはありませんか? とりあえず、 data = json.load(f) の次の行あたりに print(file) や print(data) を入れて、どのようなJSONデータのファイルでエラーが起こっているのかをつきとめていただけないでしょうか。
pepasuke623

2017/05/26 04:12

ありがとうございます!!! print(file)はすでに試していて,ファイルは問題なく読み込まれています. print(data)を実行して思いましたが,"machine"の中身がempty([]が代入されている)の物があります.これが原因かはわかりませんが,今わかるのはここまでです.
magichan

2017/05/26 04:52

たぶんそれが原因でしょうね。 おそらく {"machine":[],"time":1494824607024} のようなJSONデータがあるのだと思われます。 一応暫定対策のコードを追加しました。 今回の質問の範囲を超えてしまいますが、 1. 「どのようなメカニズムで、そのようなデータが作成されたのか?」の解析 2. 「他にどのような形式のデータが来る可能性があるのか」を洗い出し 3. 「このような例外データをどのように扱うのか」を決める を行った後に、正式な対策をとるべきかと思います。
pepasuke623

2017/05/26 05:27

何度もありがとうございます!! おっしゃる通り,セル内で”[]”がリストとして扱われていたためエラーが置きました.そして教えていただいたコードを実行したら動作しました! また,頂いたアドバイスに対しては 2. 「他にどのような形式のデータが来る可能性があるのか」に関して,まれに"machine":[A5,A7]のように複数の値が入ったリストが存在することが分かりました.この「入れ子リスト」の扱いについては別途トピックを立てさせていただきます. さしあたり,このトピックに対する質問にお答え頂き解決したので,クローズさせていただいます. 質問に対するご返答だけではなく,解説やアドバイスを頂き,非常に参考になりました.大変感謝申し上げます.m(_ _)m
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問