You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

从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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 19:36:03