【问题标题】:Key Error with json file when I try to extract specific values当我尝试提取特定值时,json文件出现关键错误
【发布时间】:2021-12-31 01:39:52
【问题描述】:

我想将所有这些元素作为列按以下顺序制作一个数据框:

来自“播放列表”: 'name'、'collaborative'、'pid'、'modified_at'、'num_tracks'、'num_albums'、'num_followers'、 'num_edits'、'duration_ms'、'num_artists'

来自“轨道”: '位置', 'artist_name'、'track_uri'、'artist_uri'、'track_name'、'album_uri'、'duration_ms'、'album_name'

来自“信息”: 'generated_on'、'slice'、'版本'

json文件的一部分如下:

{
    "info": {
        "generated_on": "2017-12-03 08:41:42.057563", 
        "slice": "0-999", 
        "version": "v1"
    }, 
    "playlists": [
        {
            "name": "Throwbacks", 
            "collaborative": "false", 
            "pid": 0, 
            "modified_at": 1493424000, 
            "num_tracks": 52, 
            "num_albums": 47, 
            "num_followers": 1, 
            "tracks": [
                {
                    "pos": 0, 
                    "artist_name": "Missy Elliott", 
                    "track_uri": "spotify:track:0UaMYEvWZi0ZqiDOoHU3YI", 
                    "artist_uri": "spotify:artist:2wIVse2owClT7go1WT98tk", 
                    "track_name": "Lose Control (feat. Ciara & Fat Man Scoop)", 
                    "album_uri": "spotify:album:6vV5UrXcfyQD1wu4Qo2I9K", 
                    "duration_ms": 226863, 
                    "album_name": "The Cookbook"
                }, 
                {
                    "pos": 1, 
                    "artist_name": "Britney Spears", 
                    "track_uri": "spotify:track:6I9VzXrHxO9rA9A5euc8Ak", 
                    "artist_uri": "spotify:artist:26dSoYclwsYLMAKD3tpOr4", 
                    "track_name": "Toxic", 
                    "album_uri": "spotify:album:0z7pVBGOD7HCIB7S8eLkLI", 
                    "duration_ms": 198800, 
                    "album_name": "In The Zone"
                }, 
 ], 
            "num_edits": 6, 
            "duration_ms": 11532414, 
            "num_artists": 37
        }, 

当我运行程序时,它给出了以下错误:

TypeError Traceback(最近一次调用最后一次) ~\AppData\Local\Temp/ipykernel_3208/3949258436.py 在 16 17 ---> 18 数据= pd.json_normalize(js['playlists'], ['name', 'collaborative', 'pid', 'modified_at', 'num_tracks', 'num_albums', 19 'num_followers'、'tracks'、'num_edits'、'num_artists']、js['info']) 20

~\anaconda3\lib\site-packages\pandas\io\json_normalize.py in _json_normalize(data, record_path, meta, meta_prefix, record_prefix, errors, sep, max_level) 293 294 meta_vals:默认字典=默认字典(列表) --> 295 meta_keys = [sep.join(val) for val in _meta] 296 297 def _recursive_extract(数据,路径,seen_meta,级别=0):

~\anaconda3\lib\site-packages\pandas\io\json_normalize.py in (.0) 293 294 meta_vals:默认字典=默认字典(列表) --> 295 meta_keys = [sep.join(val) for val in _meta] 296 297 def _recursive_extract(数据,路径,seen_meta,级别=0):

TypeError: 序列项 0: 预期的 str 实例,找到字典

这是我的代码:

import json
import pandas as pd
import os



path = 'C:\\Users\\sotir\\Desktop\\machinedataset'

filenames = os.listdir(path)
for filename in sorted(filenames):
    if filename.startswith("mpd.slice.") and filename.endswith(".json"):
        fullpath = os.sep.join((path, filename))
        f = open(fullpath)
        js = json.load(f)
        f.close()


data= pd.json_normalize(js['playlists'],  ['name', 'collaborative', 'pid', 'modified_at', 'num_tracks', 'num_albums',
                                                    'num_followers', 'tracks', 'num_edits',  'num_artists'], js['info'])

【问题讨论】:

  • 能否包含存根数据文件以便我们运行示例代码?
  • 如果您可以修改代码以在其中包含可直接访问且不需要单独的数据文件的示例数据,那就更好了...
  • 没关系...我已经使用您提供的数据对其进行了存根。

标签: python json pandas


【解决方案1】:

为了解决您的直接错误,在您的 pd.json.normalize() 调用中,将最后一个 arg 更改为:

['info']

到:

js['info']

你会得到更多的错误,但这是一个新问题的素材。

【讨论】:

  • 非常感谢您的回复,我将代码更改为js['info'],但出现另一个错误。我已经编辑了错误和代码。
【解决方案2】:

修改问题的答案:

根据https://pandas.pydata.org/pandas-docs/version/1.2.0/reference/api/pandas.json_normalize.htmlpd.json_normalize() 的第三个参数是meta=None

查看该文档页面(您肯定需要查看),我们看到:

pandas.json_normalize
pandas.json_normalize(data, record_path=None, meta=None, meta_prefix=None, record_prefix=None, errors='raise', sep='.', max_level=None)[source]
Normalize semi-structured JSON data into a flat table.

Parameters:
data: dict or list of dicts
    Unserialized JSON objects.

record_path: str or list of str, default None
    Path in each object to list of records. If not passed, data will be assumed to be an array of records.

meta: list of paths (str or list of str), default None
    Fields to use as metadata for each record in resulting table.

根据文档,meta 是一个字符串或字符串列表。您正在传递一个字典,这导致了错误。您需要阅读文档以了解如何调用 json_normalize()

【讨论】:

  • 注意:以后,一旦问题被回答,请不要更改问题。如果您需要进一步的帮助,请接受提供的答案并提出新问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-07-12
  • 2011-06-02
  • 1970-01-01
  • 2021-03-04
  • 2020-03-19
  • 1970-01-01
  • 2018-12-15
相关资源
最近更新 更多