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

新手上路,请多包涵

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

 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)

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

原文由 onetap 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 609
2 个回答

将最后一行更改为:

 temp = temp.append(data, ignore_index = True)

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

编辑:

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

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

 dfs = [] # an empty list to store the data frames
for file in file_list:
    data = pd.read_json(file, lines=True) # read data frame from json file
    dfs.append(data) # append the data frame to the list

temp = pd.concat(dfs, ignore_index=True) # concatenate all the data frames in the list.

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

原文由 Juan Estevez 发布,翻译遵循 CC BY-SA 4.0 许可协议

如果您需要扁平化 JSON,Juan Estevez 的方法将无法正常工作。这是一个替代方案:

 import pandas as pd

dfs = []
for file in file_list:
    with open(file) as f:
        json_data = pd.json_normalize(json.loads(f.read()))
    dfs.append(json_data)
df = pd.concat(dfs, sort=False) # or sort=True depending on your needs

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

 import pandas as pd

dfs = []
for file in file_list:
    with open(file) as f:
        for line in f.readlines():
            json_data = pd.json_normalize(json.loads(line))
            dfs.append(json_data)
df = pd.concat(dfs, sort=False) # or sort=True depending on your needs

原文由 Skippy le Grand Gourou 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题