如何用Pandas提取API查询中每个IP对应的坐标信息?
用Pandas提取嵌套JSON中的IP坐标信息
假设你已经把API返回的JSON数据转换成了Pandas DataFrame,每条记录包含嵌套的location字段(其中coordinates子字段存储经纬度数组),这里提供两种高效的Pandas实现方案,替代原生Python循环:
方法1:使用apply快速提取
这种方式代码简洁,适合快速实现:
import pandas as pd # 模拟API返回的JSON转成的DataFrame df = pd.DataFrame([ {"ip": "192.168.1.1", "location": {"coordinates": [116.3972, 39.9075], "city": "Beijing"}}, {"ip": "10.0.0.1", "location": {"coordinates": [121.4737, 31.2304], "city": "Shanghai"}} ]) # 提取经度(coordinates第一个元素)和纬度(第二个元素) df['longitude'] = df['location'].apply(lambda x: x['coordinates'][0]) df['latitude'] = df['location'].apply(lambda x: x['coordinates'][1]) # 查看结果 print(df[['ip', 'longitude', 'latitude']])
方法2:使用json_normalize高效解析嵌套结构
如果数据量较大(比如你提到的50条及以上),json_normalize是更优的选择,它是Pandas专门为嵌套JSON设计的矢量化解析工具,性能远高于循环和apply:
场景A:直接从原始JSON数据生成结构化DF
如果还没把JSON转成普通DataFrame,可以直接用json_normalize一步到位:
from pandas import json_normalize # 原始API返回的JSON数据 ip_json_data = [ {"ip": "192.168.1.1", "location": {"coordinates": [116.3972, 39.9075], "city": "Beijing"}}, {"ip": "10.0.0.1", "location": {"coordinates": [121.4737, 31.2304], "city": "Shanghai"}} ] # 解析嵌套字段,自动展开location下的所有子字段 normalized_df = json_normalize(ip_json_data) # 重命名坐标列,让字段更直观 normalized_df = normalized_df.rename(columns={ 'location.coordinates.0': 'longitude', 'location.coordinates.1': 'latitude' }) # 保留需要的列 final_df = normalized_df[['ip', 'longitude', 'latitude', 'location.city']]
场景B:基于已有的DataFrame解析嵌套字段
如果已经有了包含location列的DataFrame,可以单独对location字段做归一化:
from pandas import json_normalize # 假设df是已有的包含location字段的DataFrame location_details = json_normalize(df['location']) # 将解析后的坐标列和原DF合并 df = pd.concat([df, location_details], axis=1) # 将coordinates数组拆分为单独的经度、纬度列 df[['longitude', 'latitude']] = pd.DataFrame(df['coordinates'].tolist(), index=df.index) # 清理不需要的冗余列(可选) df = df.drop(['location', 'coordinates'], axis=1)
两种方法都能实现需求,其中json_normalize在处理大量数据时的性能优势更明显,推荐优先使用。
内容的提问来源于stack exchange,提问作者bbartling
相关产品推荐
相关产品推荐

