如何将大型JSON文件转换为Pandas数据帧或常规CSV文件?

2024-10-01 19:33:51 发布

您现在位置:Python中文网/ 问答频道 /正文

我已经尝试过json\u normalize,这似乎是可行的;但是,它不能输出我想要的输出。在

import requests
import json
from pandas.io.json import json_normalize
import pandas as pd

url = "https://www.qnt.io/api/results?pID=gifgif&mID=54a309ae1c61be23aba0da62&key=54a309ac1c61be23aba0da3f"

aResponse = requests.get(url)



y = json.loads(aResponse.content)
json_test = json.dumps(y, indent = 4, sort_keys=True)
print(json_test)
csv = json_normalize(y['results'])
print(csv)

显示这段代码的输出很困难,而且非常令人困惑;因此,我认为我省略它对我们双方都是最有利的。如果这是一条有用的信息,我可以补充一下。在

在json.dumps文件部分只是对我的json文件进行了整理,以便可以轻松查看。不幸的是,我不能发布整个json文件,因为Stack并不是我格式化的忠实粉丝。下面是一个小片段:

^{pr2}$

还有大约10个这样的(一直到6119;不过,我只是想让这部分工作起来)。我希望我的输出按如下顺序排列:rank、tags、embedLink、mu、sigma、index。下面是我想要的输出示例:

0, adam levine, embarassed, the voice, confession, http://media3.giphy.com/media/BE9kUwvLfsAmI/giphy.gif, 35.92818823777915, 1.88084276812386, 269

我希望它是一个csv文件;但是,我认为使用Pandas创建一个数据帧也非常有用。我想我的问题是因为我有一个很大的嵌入式json文件,而且计算机很难组织这个大的数据集。任何建议都将不胜感激!在


Tags: 文件csviotestimportjsonurlpandas
1条回答
网友
1楼 · 发布于 2024-10-01 19:33:51

首先,可以使用requests.json()而不是requests.text来获取JSON形式的响应内容。在

import requests
import pandas as pd
from pprint import pprint

url = "https://www.qnt.io/api/results?pID=gifgif&mID=54a309ae1c61be23aba0da62&key=54a309ac1c61be23aba0da3f"

response = requests.get(url)
results = response.json()["results"]

# pprint(results)

[{'cID': '5314ab42d34b6c5b402aead4',
  'content': 'BE9kUwvLfsAmI',
  'content_data': {'added_with_admin': False,
                   'dateAdded': 1393863490.072894,
                   'embedLink': 'http://media3.giphy.com/media/BE9kUwvLfsAmI/giphy.gif',
                   'still_image': 'http://media.giphy.com/media/BE9kUwvLfsAmI/200_s.gif',
                   'tags': ['adam levine',
                            'embarassed',
                            'the voice',
                            'confession']},
  'content_type': 'gif',
  'index': 269,
  'parameters': {'mu': 35.92818823777915, 'sigma': 1.88084276812386},
  'rank': 0},
 {'cID': '5314ab4dd34b6c5b402aeb97',
  ...

然后可以用pd.DataFrame.from_dict加载dict:

^{pr2}$

然后使用.apply(pd.Series)进一步展开dict中的列:

df = pd.concat([df.drop(["content_data"], axis=1), df["content_data"].apply(pd.Series)], axis=1)
df = pd.concat([df.drop(["parameters"], axis=1), df["parameters"].apply(pd.Series)], axis=1)

# print(df.head(2))
                        cID        content content_type  index  rank  \
0  5314ab42d34b6c5b402aead4  BE9kUwvLfsAmI          gif    269     0   
1  5314ab4dd34b6c5b402aeb97  NZhO1SEuFmhj2          gif    464     1   

   added_with_admin     dateAdded  \
0             False  1.393863e+09   
1             False  1.393864e+09   

                                           embedLink  \
0  http://media3.giphy.com/media/BE9kUwvLfsAmI/gi...   
1  http://media1.giphy.com/media/NZhO1SEuFmhj2/gi...   

                                         still_image  \
0  http://media.giphy.com/media/BE9kUwvLfsAmI/200...   
1  http://media.giphy.com/media/NZhO1SEuFmhj2/200...   

                                                tags         mu     sigma  
0   [adam levine, embarassed, the voice, confession]  35.928188  1.880843  
1  [ryan gosling, facepalm, embarrassed, confession]  35.702383  1.568293

并将标记从列表转换为字符串:

df["tags"] = df["tags"].apply(lambda x: ", ".join(x))

# print(df.head(2)["tags"])

0     adam levine, embarassed, the voice, confession
1    ryan gosling, facepalm, embarrassed, confession

最后得到您想要的列:

df = df[["rank", "tags", "embedLink", "mu", "sigma", "index"]]

# print(df.head(2))

   rank                                             tags  \
0     0   adam levine, embarassed, the voice, confession   
1     1  ryan gosling, facepalm, embarrassed, confession   

                                           embedLink         mu     sigma  \
0  http://media3.giphy.com/media/BE9kUwvLfsAmI/gi...  35.928188  1.880843   
1  http://media1.giphy.com/media/NZhO1SEuFmhj2/gi...  35.702383  1.568293   

   index  
0    269  
1    464

相关问题 更多 >

    热门问题