【问题标题】:How to read multiple json files into pandas dataframe?如何将多个 json 文件读入 pandas 数据框?
【发布时间】:2019-11-25 19:08:38
【问题描述】:

我很难将多行分隔的 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)

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

【问题讨论】:

    标签: python json pandas dataframe


    【解决方案1】:

    我将 Juan Estevez 的答案与 glob 结合起来。非常感谢。

    import pandas as pd
    import glob
    
    def readFiles(path):
        files = glob.glob(path)
        dfs = [] # an empty list to store the data frames
        for file in files:
            data = pd.read_json(file, lines=True) # read data frame from json file
            dfs.append(data) # append the data frame to the list
    
        df = pd.concat(dfs, ignore_index=True) # concatenate all the data frames in the list.
        return df
    

    【讨论】:

      【解决方案2】:

      如果您需要扁平化 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。我认为您的代码需要“pd”。在 'json_normalize' 前面运行。
      【解决方案3】:

      将最后一行改为:

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

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

      编辑:

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

      您应该首先创建一个数据框列表,然后使用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.
      

      这个替代方案应该会快得多。

      【讨论】:

        【解决方案4】:

        也许您应该说明,如果 json 文件是使用 pandas pd.to_json() 或以其他方式自己创建的。 我使用了不是用 pd.to_json() 创建的数据,我认为在我的情况下使用 pd.read_json() 是不可行的。相反,我编写了一个自定义的 for-each 循环方法来将所有内容写入 DataFrame

        【讨论】:

        • 您可能的意思是“文件是否为有效的 JSON”... ;)
        猜你喜欢
        • 2017-09-25
        • 2020-08-27
        • 2019-07-02
        • 2017-01-30
        • 1970-01-01
        • 2021-01-21
        • 2019-09-09
        • 1970-01-01
        • 2013-11-30
        相关资源
        最近更新 更多