python - 遍历 json api 并将结果附加到 pandas 数据帧
问题描述
我正在尝试将 Excel 数据加载到 Pandas DataFrame 中,然后将 ip_address 从 DataFrame 推送到以 json 格式返回信息的 api,然后将 json 中的结果附加回原始 DataFrame - 我该怎么做,遍历数据框中的每一行并每次都将结果附加回来?
初始数据框:
date | ip | name
date1 | ip1 | name1
date2 | ip2 | name2
json:
{
"status": "ok",
"8.8.8.8": {
"proxy": "yes",
"type": "VPN",
"provider": "Google Inc",
"risk": 66
}
}
代码:
df = pd.read_excel (r'test_data.xlsx')
def query_api(ip_address):
risk_score = None
vpn_score = None
api_key = "xxx"
base_url = "http://falseacc.com/"
endpoint = f"{base_url}{ip_address}?key={api_key}&risk=1&vpn=1"
r = requests.get(endpoint)
if r.status_code not in range(200, 299):
return None, None
try:
with urllib.request.urlopen(endpoint) as url:
data = json.loads(url.read().decode())
proxy = (data[ip_address]['proxy'])
type = (data[ip_address]['type'])
risk = (data[ip_address]['risk'])
df2 = pd.Dataframe({"ip":[ip_address],
"proxy":[proxy],
"type":[type],
"risk":[risk]})
print(df2)
except:
print("No data")
预期输出:数据框:
date | ip | name | proxy | type | risk
date1 | ip1 | name1 | proxy1 | type1 | risk1
date2 | ip2 | name2 | proxy2 | type2 | risk2
解决方案
您可以使用 pandas 方法从数据框中Series.apply
选择每个ip ,并从您的函数中获取与其对应的代理、类型、风险值。query_api
然后将值分配给最后的相应列:
df = pd.read_excel (r'test_data.xlsx')
def query_api(ip_address):
risk_score = None
vpn_score = None
api_key = "xxx"
base_url = "http://falseacc.com/"
endpoint = f"{base_url}{ip_address}?key={api_key}&risk=1&vpn=1"
r = requests.get(endpoint)
if r.status_code not in range(200, 299):
return pd.Series([None]*3)
try:
with urllib.request.urlopen(endpoint) as url:
data = json.loads(url.read().decode())
proxy = (data[ip_address]['proxy'])
type = (data[ip_address]['type'])
risk = (data[ip_address]['risk'])
return pd.Series([proxy, type, risk])
except:
return pd.Series([None]*3)
df[['proxy','type','risk']] = df.ip.apply(query_api)
查看官方文档以了解其pandas.Series.apply
工作原理。
我还建议不要在代码中使用typetype
作为变量名,因为它掩盖了python中的内置函数
推荐阅读
- python-3.x - vscode on Ubuntu is unable to open windows
- java - 如果多个条件匹配,则 JsonPath 选择对象字段
- arrays - 如何在c中的结构内为结构数组赋值?
- c# - Correct way to insert date into database depending on selected drop down
- html - 如何打开在 URL 中使用 id 时
- java - 无法使用 Java 正则表达式匹配字符串的最后部分
- python - What does "rx" or "bx" mean as the third argument of ax.plot?
- spring-boot - 在 Spring Boot 应用程序中使用 Logback 时出错
- amazon-web-services - AWS S3 Select:带有 json 数组的 WHERE 子句
- c# - 如何使用 IocManager 为 Aspnet 样板中的不同构造函数参数集注册类的单例