2017-09-29 13 views
1

パンダには、jsonを平坦化できるpandas.io.json.json_normalizeメソッドがあります。パンダ、json-per-line

私は、json-per-lineデータ(長時間実行されるプロセスによってファイルにストリームされる)を含むソースファイルを持っています。私は実際にそのファイルに書かれているものを変更する立場にはありません。ここではJSONの不自然な例です:

{"type": "bar", "aspect": {"Positive": 1, "Negative": 0.6}} {"type": "bar", "aspect": {"Positive": 0.6, "Negative": 1.5}}

私はlines=Trueパラメータを渡すことで、通常のpandas.read_json方法を使用してそれを読むことができます。しかし、json_normalizeのように、実際に有用な形式になるように、私はそれを平坦化したいと思います。

>>> json_normalize(json.loads('{"type": "bar", "aspect": {"Positive": 1, "Negative": 0.6}}')) aspect.Negative aspect.Positive type 0 0.6 1 bar

ソースを介してIループは、正規化し、追加した場合、それは私が追加行ごとに完全なコピーをもたらすようになるだろう。それは本当にパフォーマンスを傷つけるでしょう。

答えて

1

あなたはread_json + DataFrame constructor + add_prefix + drop + joinを使用することができます。

df = pd.read_json('file.json', lines = True) 
print (df) 
               aspect type 
0 {'Negative': 0.6000000000000001, 'Positive': 1} bar 
1 {'Negative': 1.5, 'Positive': 0.6000000000000001} bar 

df = (pd.DataFrame(df['aspect'].values.tolist()) 
     .add_prefix('aspect.') 
     .join(df.drop('aspect', 1))) 
print (df) 
    aspect.Negative aspect.Positive type 
0    0.6    1.0 bar 
1    1.5    0.6 bar 

または各行コールjson.loadsと最後に使用しjson_normalize用:

df = json_normalize(pd.Series(open('file.json').readlines()).apply(json.loads)) 
print (df) 
    aspect.Negative aspect.Positive type 
0    0.6    1.0 bar 
1    1.5    0.6 bar 

df = json_normalize([json.loads(x) for x in open('file.json').readlines()]) 
print (df) 

    aspect.Negative aspect.Positive type 
0    0.6    1.0 bar 
1    1.5    0.6 bar 

タイミング(5k行):

In [13]: %timeit json_normalize([json.loads(x) for x in open('file.json').readlines()]) 
10 loops, best of 3: 112 ms per loop 

In [14]: %timeit json_normalize(pd.Series(open('file.json').readlines()).apply(json.loads)) 
10 loops, best of 3: 117 ms per loop 

In [15]: %%timeit 
    ...: df = pd.read_json('file.json', lines = True) 
    ...: df = (pd.DataFrame(df['aspect'].values.tolist()).add_prefix('aspect.').join(df.drop('aspect', 1))) 
    ...: 
10 loops, best of 3: 30.1 ms per loop 
+0

タイムテーブル情報を含めていただきありがとうございます。 – Twirrim

+0

喜んで助けることができます!私も興味があったが、どのソリューションが最速か) – jezrael