Python 迭代json api并将结果附加到数据帧
我正在尝试将Excel数据加载到Pandas数据框中,然后将ip_地址从数据框推送到一个api,该api以json格式返回信息,然后将json的结果追加到原始数据框中——我如何做到这一点,迭代数据框中的每一行,每次追加结果 初始数据帧:Python 迭代json api并将结果附加到数据帧,python,json,urllib,Python,Json,Urllib,我正在尝试将Excel数据加载到Pandas数据框中,然后将ip_地址从数据框推送到一个api,该api以json格式返回信息,然后将json的结果追加到原始数据框中——我如何做到这一点,迭代数据框中的每一行,每次追加结果 初始数据帧: date | ip | name date1 | ip1 | name1 date2 | ip2 | name2 json: 代码: 预期产出: 数据帧: date | ip | name | proxy | type | risk date1 | ip1 |
date | ip | name
date1 | ip1 | name1
date2 | ip2 | name2
json:
代码:
预期产出:
数据帧:
date | ip | name | proxy | type | risk
date1 | ip1 | name1 | proxy1 | type1 | risk1
date2 | ip2 | name2 | proxy2 | type2 | risk2
您可以使用pandas
系列。应用
方法从数据帧中选取每个ip,并从查询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)
看看官方网站,了解熊猫系列应用的工作原理
我还建议不要在代码中使用类型作为变量名,因为它掩盖了python中内置的
类型
函数您可以使用pandas系列。应用
方法从数据帧中选择每个ip,并获取代理,类型,从query\u 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)
看看官方网站,了解熊猫系列应用的工作原理
我还建议不要在代码中使用type作为变量名,因为它掩盖了python中内置的
type
函数API是否允许同时推送多个IP?API是否允许同时推送多个IP?谢谢,我遇到一个错误,试图将其分配回原始df:AttributeError:“DataFrame”对象没有属性“ip”。删除ip,使其显示为:df[['proxy','ip_type','risk']]=df.apply(query_api)-然后按预期返回数据帧,但proxy/ip_type/risk列均为“None”。您确定在问题中发布的数据帧中有'ip'列吗?存储ip的数据帧中的列名是什么?是,样本返回:日期ip名称代理ip_类型风险0 2021-01-01 8.8.8.8 tommo None None None 1 2021-01-01 4.4.4 bexx None None None 2 2021-01-01 8.8.8.8 saint None None None
成功运行,是因为它是“ip”而不是“ip”-非常感谢!谢谢,我遇到了一个错误,试图将其分配回原始df:AttributeError:“DataFrame”对象没有属性“ip”。删除ip,使其显示为:df[['proxy','ip_type','risk']]=df.apply(query_api)-然后按预期返回数据帧,但proxy/ip_type/risk列均为“None”。您确定在问题中发布的数据帧中有'ip'列吗?存储ip的数据帧中的列名是什么?是,样本返回:日期ip名称代理ip_类型风险0 2021-01-01 8.8.8.8 tommo None None None 1 2021-01-01 4.4.4 bexx None None None 2 2021-01-01 8.8.8.8 saint None None None
成功运行,是因为它是“ip”而不是“ip”-非常感谢!
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)