迭代 json api 并将结果附加到 pandas 数据框
Iterate over json api and append results to pandas dataframe
我正在尝试将 Excel 数据加载到 Pandas DataFrame 中,然后将 ip_address 从 DataFrame 推送到 api returns以 json 格式返回信息,然后将 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,并获取 代理,键入, risk 值对应于您的 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)
查看官方 docs 了解 pandas.Series.apply
的工作原理。
我还建议不要在代码中使用 type 作为变量名,因为它掩盖了 python 中内置的 type
函数
我正在尝试将 Excel 数据加载到 Pandas DataFrame 中,然后将 ip_address 从 DataFrame 推送到 api returns以 json 格式返回信息,然后将 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,并获取 代理,键入, risk 值对应于您的 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)
查看官方 docs 了解 pandas.Series.apply
的工作原理。
我还建议不要在代码中使用 type 作为变量名,因为它掩盖了 python 中内置的 type
函数