读取多份JSON文件合并为DataFrame时报错如何修改代码?
问题原因与修改方案
报错原因
你触发报错的核心问题是使用了==判断DataFrame对象是否为None:
当df1已经被赋值为DataFrame类型后,df1 == None操作会对DataFrame的每一个元素和None做等值比对,返回的是布尔型的DataFrame结构,Pandas不允许直接将整个DataFrame放在if条件中做布尔判断,因此抛出了The truth value of a DataFrame is ambiguous的错误。
必须修改的代码
将第18行的判断条件:
if df1==None:
替换为:
if df1 is None:
is是Python的身份运算符,直接判断变量指向的内存对象是否为None,不会触发DataFrame的元素级比对,即可解决报错。
可选优化方案(推荐)
你当前循环中每次调用pd.concat都会生成新的DataFrame,文件数量多的时候效率较低,可以调整为先收集所有子DataFrame最后再合并,同时用with上下文管理器管理文件打开操作,避免资源泄漏:
import json import pandas as pd import os path = 'C:\\Users\\sotir\\Desktop\\machinedataset' filenames = os.listdir(path) df_list = [] for filename in sorted(filenames): if filename.startswith("mpd.slice") and filename.endswith(".json"): fullpath = os.path.join(path, filename) with open(fullpath, 'r', encoding='utf-8') as f: js = json.load(f) df = pd.json_normalize( js['playlists'], meta=['name', 'collaborative', 'pid', 'modified_at','num_tracks', 'num_albums', 'num_followers', 'num_edits', 'duration_ms', 'num_artists'], record_path= ['tracks'], record_prefix='_' ) df_list.append(df) # 所有文件读取完成后统一合并 df_total = pd.concat(df_list, ignore_index=True)
补充:你之前出现只保留最后一个文件数据的问题,大概率是之前的代码没有写累加拼接的逻辑,每次循环直接将新的df赋值给了总变量,修改为上述逻辑后即可正常合并所有文件数据。
内容的提问来源于stack exchange,提问作者manduk
相关产品推荐
相关产品推荐

