首页 > 解决方案 > 遍历 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

标签: pythonjsonurllib

解决方案


您可以使用 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中的内置函数


推荐阅读