使用Python和Pandas访问JSON元素的三类操作问题咨询
问题解答
1、获取coord字段的独立子元素
coord列的每一行都是字典格式,有两种常用实现方式:
- 直接从现有
coord列提取子字段:
用.str字典访问器即可实现,示例代码:# 提取lon、lat为独立列 df['lon'] = df['coord'].str['lon'] df['lat'] = df['coord'].str['lat'] - 加载数据时直接展开嵌套字段:
用pd.json_normalize直接把嵌套的coord字段展开成顶层列,加载代码可以调整为:
处理后DataFrame会直接生成import requests import gzip from io import BytesIO url = 'http://bulk.openweathermap.org/sample/city.list.json.gz' resp = requests.get(url) decompressed_data = gzip.decompress(resp.content) # 展开嵌套JSON结构 df = pd.json_normalize(pd.read_json(decompressed_data))coord.lon、coord.lat两个独立列,直接访问即可。
2、查询结果赋值给变量的写法说明
你给出的写法是合法的,但要注意返回值的类型差异:
- 如果你写
state = df.loc[df['name'] == city, ['state']],返回的是DataFrame类型,即使只有一行结果也是表格格式 - 如果你想要得到Series格式的结果,去掉列名外层的列表即可:
state = df.loc[df['name'] == city, 'state'] - 如果你能确定筛选结果只有1条,想要直接得到字符串/数值类型的标量结果,再加
.iloc[0]取第一条即可:state = df.loc[df['name'] == city, 'state'].iloc[0]
3、多条件复合筛选实现
多个筛选条件需要用&(逻辑与)、|(逻辑或)、~(逻辑非)连接,每个条件必须用括号包裹,不能用Python原生的and/or关键字。
你需要的同时匹配城市名和州的筛选示例代码:
# 同时满足name等于指定city、state等于指定state的查询 query = df.loc[(df['name'] == city) & (df['state'] == state), ['id', 'name', 'state', 'coord']]
内容的提问来源于stack exchange,提问作者Mike Zoucha
相关产品推荐
相关产品推荐

