Pandas加载JSON生成DataFrame无法直接过滤,存CSV再读取则正常
这种现象通常由以下几种常见原因导致:
1. 列名包含隐藏/不可见字符
API返回的JSON数据中,stock_exchange对应的键可能带有不可见空白字符(比如前后空格、全角空格、零宽空格\u200b)或者特殊符号。直接加载为DataFrame时,列名会完整保留这些字符,此时你用df['stock_exchange']调用会因为字符不匹配触发KeyError。
而当你将DataFrame保存为CSV时,这些隐藏字符会被写入文件,但使用pd.read_csv()读取时,Pandas默认的解析参数(比如skipinitialspace=True)会自动忽略列名前后的空白字符,或者某些不可见字符会被CSV的文本格式过滤,最终得到干净的stock_exchange列名,因此可以正常筛选。
你可以通过print(df.columns)查看直接加载后的列名,对比读取CSV后的列名,就能发现差异(比如列名前后的空格)。
2. JSON结构嵌套导致列未直接暴露
如果API返回的JSON是嵌套结构(比如stock_exchange是子字典中的键),直接用pd.DataFrame(api_response)加载时,顶层列可能只有父级键(比如info),而stock_exchange是该列中每个元素的子属性,此时DF中并没有顶层的stock_exchange列,自然会触发KeyError。
但将DF保存为CSV时,Pandas会把嵌套的字典列转成字符串格式写入,而你读取CSV时可能无意中对该列做了解析(或者Pandas的CSV解析器自动处理了嵌套字符串),最终生成了独立的stock_exchange列。
这种情况可以用pd.json_normalize(api_response)替代pd.DataFrame()来加载API数据,直接将嵌套结构扁平化为顶层列,就能避免这个问题。
3. Pandas解析JSON的参数差异
如果API返回的是JSON Lines格式(每行一个独立JSON对象),直接用json.loads()解析后转DataFrame可能会导致结构错误,遗漏stock_exchange列。但保存为CSV后,每行的结构被标准化,pd.read_csv()能正确识别列。
此时应该用pd.read_json(response.text, lines=True)来直接加载API返回的JSON Lines数据,确保列被正确解析。
内容的提问来源于stack exchange,提问作者anarchy

