回答问题

Pandas 有pandas.io.json.json_normalize可以扁平化 json 的方法。

我有一个源文件,其中包含每行 json 数据(通过长时间运行的过程流式传输到文件)。我真的无法修改写入该文件的内容。这是一个人为的 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

如果我循环遍历源、规范化和追加,这将导致我添加的每一行的完整副本。这真的会损害性能。

Answers

You can use 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
Logo

学AI,认准AI Studio!GPU算力,限时免费领,邀请好友解锁更多惊喜福利 >>>

更多推荐