数据分析师必备:5分钟教你用Pandas处理深圳公开数据API返回的JSON

数据分析师必备:5分钟教你用Pandas处理深圳公开数据API返回的JSON 数据分析师必备5分钟教你用Pandas处理深圳公开数据API返回的JSON深圳市政府公开数据平台提供了丰富的数据资源但API返回的JSON数据往往包含嵌套结构、非标准字段和大量记录直接分析存在困难。本文将分享如何快速将这些原始JSON转换为规整的Pandas DataFrame让你在5分钟内完成数据清洗的关键步骤。1. 理解API返回的JSON结构在开始处理前我们需要先了解API返回的JSON数据结构。典型的政府开放数据API响应可能如下{ code: 200, message: success, data: [ { id: 001, name: 空气质量监测, location: { district: 南山区, coordinates: [113.92, 22.52] }, readings: [ {time: 08:00, pm2_5: 35}, {time: 12:00, pm2_5: 42} ] } ] }这种结构常见的问题包括多层嵌套的字典和列表字段命名不规范如大小写混用、缩写数据类型不一致如数字被存储为字符串提示使用requests获取数据后先用.json()方法转换为Python字典再用pprint打印查看完整结构。2. 展平嵌套数据结构对于嵌套结构Pandas的json_normalize是最佳选择。以下是处理上述示例数据的代码import pandas as pd from pandas import json_normalize # 假设response是API返回的原始JSON data response.json()[data] # 一级展平 df json_normalize( data, meta[id, name, [location.district, district]], record_pathreadings, meta_prefixmeta_ ) # 重命名列 df df.rename(columns{ time: 监测时间, pm2_5: PM2.5浓度, meta_location.district: 行政区, meta_id: 监测点ID })处理后的DataFrame将变为监测时间PM2.5浓度行政区监测点ID08:0035南山区00112:0042南山区001对于更复杂的嵌套可以分步处理先提取顶层信息然后处理嵌套列表最后合并结果3. 字段清洗与类型转换获取规整数据后常见的清洗操作包括3.1 处理缺失值# 填充缺失值 df.fillna({ PM2.5浓度: df[PM2.5浓度].median(), 行政区: 未知 }, inplaceTrue) # 或删除缺失行 df.dropna(subset[监测点ID], inplaceTrue)3.2 类型转换df[监测时间] pd.to_datetime(df[监测时间], format%H:%M) df[PM2.5浓度] pd.to_numeric(df[PM2.5浓度])3.3 字段标准化# 统一行政区名称 district_mapping { 南山: 南山区, 南山區: 南山区 } df[行政区] df[行政区].replace(district_mapping)4. 数据质量检查与探索完成清洗后建议进行快速检查# 基本统计信息 print(df.describe()) # 唯一值检查 print(df.nunique()) # 示例查询 - 南山区PM2.5平均值 print(df[df[行政区]南山区][PM2.5浓度].mean())对于大型数据集可以使用Dask或Modin替代Pandas以提高性能import dask.dataframe as dd ddf dd.from_pandas(df, npartitions4)5. 输出与自动化集成最后将处理好的数据保存为CSV或直接接入分析流程# 保存CSV df.to_csv(cleaned_data.csv, indexFalse, encodingutf_8_sig) # 或者直接接入分析 import matplotlib.pyplot as plt df.groupby(行政区)[PM2.5浓度].mean().plot.bar() plt.show()对于定期更新的数据可以将上述步骤封装为函数def process_api_data(url): response requests.get(url) data response.json()[data] df json_normalize(data, ...) # 处理步骤 return df # 定时任务 schedule.every().day.at(09:00).do(process_api_data, urlapi_url)实际项目中我习惯将清洗逻辑写成类方便复用和管理不同数据集的处理流程。例如创建一个ShenzhenDataCleaner类封装各种数据源的特有处理逻辑。