Python 迭代json api并将结果附加到数据帧

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 |

我正在尝试将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 | 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)