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

b5buobof  于 2022-12-20  发布在  其他
关注(0)|答案(5)|浏览(112)

我很难将多行分隔的JSON文件加载到一个panda Dataframe 中。下面是我使用的代码:

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的时候,看起来所有的文件都在加载,但是我不知道如何把每个文件放入一个 Dataframe 中。大约有50个文件,每个文件中有几行。

tvmytwxo

tvmytwxo1#

将最后一行更改为:

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

我们必须这样做的原因是因为append不是在适当的位置发生的,append方法不修改 Dataframe ,它只是返回一个新的 Dataframe 和append操作的结果。

编辑:

自从写了这个答案之后,我了解到永远不要在循环中使用DataFrame.append,因为它会导致二次复制(参见this answer)。
你应该做的是先创建一个 Dataframe 列表,然后使用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.

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

deikduxw

deikduxw2#

如果需要将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
vx6bjr1n

vx6bjr1n3#

我把胡安·埃斯特维斯的答案和“一团一团”结合起来了。谢谢。

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
31moq8wy

31moq8wy4#

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])```
ryevplcw

ryevplcw5#

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

相关问题