处理嵌套 JSON

使用 pandas 高效导入数据

Amany Mahfouz

Instructor

嵌套 JSON

  • JSON 包含由属性-值对组成的对象
  • 当值本身是对象时,JSON 为嵌套结构
使用 pandas 高效导入数据

Yelp 商家 API 文档中的示例 JSON 响应

使用 pandas 高效导入数据

示例 Yelp 响应数据,突出显示嵌套的坐标和位置数据

使用 pandas 高效导入数据

示例 Yelp 响应数据,突出显示嵌套的分类数据

使用 pandas 高效导入数据

示例 Yelp 响应数据,突出显示 businesses 下的嵌套记录

使用 pandas 高效导入数据
# 打印包含嵌套数据的列
print(bookstores[["categories", "coordinates", "location"]].head(3))
                                          categories  \
0   [{'alias': 'bookstores', 'title': 'Bookstores'}]   
1  [{'alias': 'bookstores', 'title': 'Bookstores'...   
2   [{'alias': 'bookstores', 'title': 'Bookstores'}]     

                                         coordinates  \
0  {'latitude': 37.7975997924805, 'longitude': -1...   
1  {'latitude': 37.7885846793652, 'longitude': -1...   
2  {'latitude': 37.7589836120605, 'longitude': -1...    

                                            location  
0  {'address1': '261 Columbus Ave', 'address2': '...  
1  {'address1': '50 2nd St', 'address2': '', 'add...  
2  {'address1': '866 Valencia St', 'address2': ''...
使用 pandas 高效导入数据

pandas.io.json

  • pandas.io.json 子模块提供读取/写入 JSON 的工具
    • 需要单独的 import 语句
  • json_normalize()
    • 接收字典/字典列表(类似 pd.DataFrame()
    • 返回扁平化的 dataframe
    • 默认扁平列名模式:attribute.nestedattribute
    • sep 参数更改分隔符
使用 pandas 高效导入数据

加载嵌套 JSON 数据

import pandas as pd
import requests

from pandas.io.json import json_normalize
# 设置请求头、参数和 API 端点 api_url = "https://api.yelp.com/v3/businesses/search" headers = {"Authorization": "Bearer {}".format(api_key)} params = {"term": "bookstore", "location": "San Francisco"}
# 调用 API 并提取 JSON 数据 response = requests.get(api_url, headers=headers, params=params) data = response.json()
使用 pandas 高效导入数据
# 扁平化并加载到 dataframe,使用下划线分隔
bookstores = json_normalize(data["businesses"], sep="_")
print(list(bookstores))
['alias', 
 'categories',
 'coordinates_latitude',
 'coordinates_longitude',
 ...
 'location_address1',
 'location_address2',
 'location_address3',
 'location_city',
 'location_country',
 'location_display_address',
 'location_state',
 'location_zip_code',
 ...
 'url']
使用 pandas 高效导入数据

深层嵌套数据

print(bookstores.categories.head())
0     [{'alias': 'bookstores', 'title': 'Bookstores'}]
1    [{'alias': 'bookstores', 'title': 'Bookstores'...
2     [{'alias': 'bookstores', 'title': 'Bookstores'}]
3     [{'alias': 'bookstores', 'title': 'Bookstores'}]
4    [{'alias': 'bookstores', 'title': 'Bookstores'...
Name: categories, dtype: object
使用 pandas 高效导入数据

深层嵌套数据

  • json_normalize()
    • record_path:到嵌套数据的属性路径(字符串/字符串列表)
    • meta:要一并加载到 dataframe 的其他属性列表
    • meta_prefix:为 meta 列名添加的前缀字符串
使用 pandas 高效导入数据

深层嵌套数据

# 扁平化 categories,并带入门店详情
df = json_normalize(data["businesses"],
                    sep="_",

record_path="categories",
meta=["name", "alias", "rating", ["coordinates", "latitude"], ["coordinates", "longitude"]],
meta_prefix="biz_")
使用 pandas 高效导入数据
print(df.head(4))
        alias               title                biz_name  \
0  bookstores          Bookstores   City Lights Bookstore   
1  bookstores          Bookstores  Alexander Book Company   
2  stationery  Cards & Stationery  Alexander Book Company   
3  bookstores          Bookstores       Borderlands Books   

                              biz_alias  biz_rating  biz_coordinates_latitude  \
0   city-lights-bookstore-san-francisco         4.5                 37.797600   
1  alexander-book-company-san-francisco         4.5                 37.788585   
2  alexander-book-company-san-francisco         4.5                 37.788585   
3       borderlands-books-san-francisco         5.0                 37.758984   

   biz_coordinates_longitude  
0                -122.406578  
1                -122.400631  
2                -122.400631  
3                -122.421638
使用 pandas 高效导入数据

Passons à la pratique !

使用 pandas 高效导入数据

Preparing Video For Download...