无法将完整数据从 json 文件加载到数据框中

Posted

技术标签:

【中文标题】无法将完整数据从 json 文件加载到数据框中【英文标题】:Couldn't load full data into data frame from json files 【发布时间】:2017-05-03 17:07:57 【问题描述】:

我是 python 新手。尝试使用此 link 为我的案例构建代码

我有 200k json 文件,需要将其放入数据框中。

为了实现这一点,我为我的问题制作了示例案例,如下所示。

我在子目录中有一个包含 json 文件的文件夹“test”。目录如下所示:

test>test1>test1> 3 json files 
test>test2>test2> 3 json files 
test>test3>test3> 3 json files

我正在尝试将所有 9 个 json 文件放入一个数据框中。我的代码如下:

import json
import os
import pandas as pd
import json

jpath='C:\\Users\\Sharath\\Desktop\\test'

result=[]
for i in os.listdir(jpath):
    k=os.path.join(jpath,i)
    for j in os.listdir(k):
        l=os.path.join(k,j)
        result.append(l)
print(result)

['C:\\Users\\Sharath\\Desktop\\test\\test1\\test1', 'C:\\Users\\Sharath\\Desktop\\test\\test2\\test2', 'C:\\Users\\Sharath\\Desktop\\test\\test3\\test3']

jsons_data = pd.DataFrame(columns=['homepage_url', 'number_of_employees', 'email_address'])
for i in range(len(result)):
    for j in os.listdir(result[i]):
        with open(os.path.join(result[i],j)) as jfile:
            jtext=json.load(jfile)         
            homepage_url = jtext['homepage_url']
            number_of_employees = jtext['number_of_employees']
            email_address = jtext['email_address']
            jsons_data.loc[index]=[homepage_url,number_of_employees,email_address]
        print(jsons_data)


           homepage_url  number_of_employees          email_address
2  http://www.01tek.com                  1.0  khouidi.you@gmail.com
              homepage_url  number_of_employees      email_address
2  http://www.123listo.com                  NaN  info@123listo.com
                      homepage_url  number_of_employees email_address
2  http://www.immortaloutdoors.com                  NaN              
                         homepage_url  number_of_employees  \
2  http://www.1on1fitnesstraining.com                 50.0   

                      email_address  
2  1on1fitnesstraining013@gmail.com  
                    homepage_url  number_of_employees        email_address
2  http://1onlybat.bigcartel.com                  NaN  office@1onlybat.com
           homepage_url  number_of_employees       email_address
2  http://www.1doc3.com                  5.0  contacto@1doc3.com
           homepage_url  number_of_employees email_address
2  http://1phoneapp.com                 10.0              
  homepage_url  number_of_employees email_address
2         None                  NaN              
                        homepage_url  number_of_employees  \
2  http://www.1stalliancelending.com                 51.0   

              email_address  
2  info@placewelovemost.com  

当我尝试调用jsons_data查看dataframe时,结果如下:

我无法理解为什么我只得到一个索引为 2 的结果。 请帮助我如何使用此方法获取数据框中的所有 9 个文件。

【问题讨论】:

我认为您没有在代码中的任何位置分配或更新变量 index。如果是这样,那么它总是等于零,并且您的最终列表包含一个结果,以最后处理的文件为准。 您是否考虑过 pd.read_json() 然后连接数据帧?文件平均有多大?这可能是一种选择。如果您想遵循链接中的方法,您应该更新索引(再次仔细查看您使用的链接,它们会更新索引变量),如@K.A.Buhr 所述 【参考方案1】:

有几种方法可以做到这一点。一种是使用 pd.read_json() 然后连接数据帧。假设您想使用您提到的链接中的方法,您需要更新循环中的变量索引,因此您可以更改代码,以便您的主循环为:

for i in range(len(result)):
    for index, j in enumerate(os.listdir(result[i])):
        with open(os.path.join(result[i],j)) as jfile:
            jtext=json.load(jfile)         
            homepage_url = jtext['homepage_url']
            number_of_employees = jtext['number_of_employees']
            email_address = jtext['email_address']
            jsons_data.loc[index]=[homepage_url,number_of_employees,email_address]
        print(jsons_data)

注意一行:

for j in os.listdir(result[i]):

改成

for index, j in enumerate(os.listdir(result[i])):

【讨论】:

以上是关于无法将完整数据从 json 文件加载到数据框中的主要内容,如果未能解决你的问题,请参考以下文章

加快将 json 数据加载到数据框中

将数据加载到 redshift 数据库中

什么更快? Ajax 加载 JSON 或 Ajax 加载完整输出

如何将 json 加载到 pandas 数据框中?

如何将字符串中带有双引号的json文件加载到spark scala中的数据框中

在 spark 数据框中使用 where 子句加载数据