使用 pandas 高效导入数据
Amany Mahfouz
Instructor




# 打印包含嵌套数据的列
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.io.json 子模块提供读取/写入 JSON 的工具import 语句json_normalize()pd.DataFrame())attribute.nestedattributesep 参数更改分隔符import pandas as pd import requestsfrom 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()
# 扁平化并加载到 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']
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
json_normalize()record_path:到嵌套数据的属性路径(字符串/字符串列表)meta:要一并加载到 dataframe 的其他属性列表meta_prefix:为 meta 列名添加的前缀字符串# 扁平化 categories,并带入门店详情 df = json_normalize(data["businesses"], sep="_",record_path="categories",meta=["name", "alias", "rating", ["coordinates", "latitude"], ["coordinates", "longitude"]],meta_prefix="biz_")
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 高效导入数据