从JSON文件提取tracks字段生成DataFrame及KeyError: 'pos'报错咨询
问题原因
你触发KeyError的核心原因是:pd.json_normalize(js['playlists'])生成的df3中,tracks列的每一行都是存储对应歌单下所有歌曲信息的列表,属于未展平的嵌套结构,不存在pos这个顶层键,直接访问自然报错。
解决方法
使用pd.json_normalize的record_path参数直接指定要展开的嵌套路径为tracks,即可将tracks下的所有字段直接映射为DataFrame的独立列。如果需要保留所属歌单的相关信息(比如歌单id、歌单名称),可以通过meta参数同步携带歌单层级的字段。
同时你原有代码的循环逻辑有问题:每次循环都会覆盖js变量,最终只会保留最后一个JSON文件的数据,下面的修改版同时支持合并所有切片文件的歌曲数据:
import json import pandas as pd import os path = 'C:\\Users\\sotir\\Desktop\\machinedataset' filenames = os.listdir(path) all_tracks = [] for filename in sorted(filenames): if filename.startswith("mpd.slice.") and filename.endswith(".json"): fullpath = os.path.join(path, filename) # 用with上下文管理器自动处理文件关闭,更稳定 with open(fullpath, 'r', encoding='utf-8') as f: js = json.load(f) # 展开tracks嵌套结构 track_df = pd.json_normalize( data=js['playlists'], record_path='tracks', # 不需要保留歌单信息的话可以删掉下面的meta参数 meta=['pid', 'name', 'num_followers'] ) all_tracks.append(track_df) # 合并所有文件的歌曲数据 final_df = pd.concat(all_tracks, ignore_index=True) pd.options.display.float_format = '{:,.1f}'.format # 直接访问目标字段即可 print(final_df[['pos', 'artist_name', 'track_uri']])
验证
运行后final_df的列就包含你需要的pos、artist_name、track_uri等字段,不会再触发KeyError。
内容的提问来源于stack exchange,提问作者manduk
相关产品推荐
相关产品推荐

