如何将多个json文件读入pandas数据帧?

one*_*tap 15 python json dataframe pandas

我很难将多行分隔的 JSON 文件加载到单个 Pandas 数据帧中。这是我正在使用的代码:

import os, json
import pandas as pd
import numpy as np
import glob
pd.set_option('display.max_columns', None)

temp = pd.DataFrame()

path_to_json = '/Users/XXX/Desktop/Facebook Data/*' 

json_pattern = os.path.join(path_to_json,'*.json')
file_list = glob.glob(json_pattern)

for file in file_list:
    data = pd.read_json(file, lines=True)
    temp.append(data, ignore_index = True)
Run Code Online (Sandbox Code Playgroud)

当我查看时,似乎所有文件都在加载file_list,但无法弄清楚如何将每个文件放入数据帧中。大约有 50 个文件,每个文件中有几行。

Jua*_*vez 21

将最后一行更改为:

temp = temp.append(data, ignore_index = True)
Run Code Online (Sandbox Code Playgroud)

我们必须这样做的原因是因为附加没有发生。append 方法不会修改数据框。它只是返回一个带有追加操作结果的新数据帧。

编辑:

自从写了这个答案后,我了解到你不应该DataFrame.append在循环内使用,因为它会导致二次复制(见这个答案)。

您应该做的是首先创建一个数据框列表,然后使用pd.concat单个操作将它们全部连接起来。像这样:

temp = temp.append(data, ignore_index = True)
Run Code Online (Sandbox Code Playgroud)

这种替代方法应该快得多。


0-_*_*_-0 9

from pathlib import Path
import pandas as pd

paths = Path("/home/data").glob("*.json")
df = pd.DataFrame([pd.read_json(p, typ="series") for p in paths])
Run Code Online (Sandbox Code Playgroud)


Ski*_*rou 7

如果您需要展平 JSON,Juan Estevez\xe2\x80\x99s 方法不会\xe2\x80\x99s 按原样工作。这是一个替代方案\xe2\x80\xaf:

\n
import pandas as pd\n\ndfs = []\nfor file in file_list:\n    with open(file) as f:\n        json_data = pd.json_normalize(json.loads(f.read()))\n    dfs.append(json_data)\ndf = pd.concat(dfs, sort=False) # or sort=True depending on your needs\n
Run Code Online (Sandbox Code Playgroud)\n

或者,如果您的 JSON 是行分隔的(未测试)\xe2\x80\xaf:

\n
import pandas as pd\n\ndfs = []\nfor file in file_list:\n    with open(file) as f:\n        for line in f.readlines():\n            json_data = pd.json_normalize(json.loads(line))\n            dfs.append(json_data)\ndf = pd.concat(dfs, sort=False) # or sort=True depending on your needs\n
Run Code Online (Sandbox Code Playgroud)\n