Фрейм данных

   uid,api_url
    1, abc.com
    2, xyz.com

Код

def query():
    jso = {"id": uid,"docs": {"doc1":api_url,"type": "US","advanced": {"details":true}}} 
    json_d = json_dumps(jso)
    headers = {"Content-Type": "application/json"}
    response = requests.post("https://example.net/document",headers=headers,json=json_d)
    return response.text

Применить на df {{Х0}}

NameError: name 'uid' is not defined

Приведенный ниже запрос работает нормально при применении к переменной и жесткому кодированию ui_id:'random_number'

def query_api(api_url):
    headers = {"Content-Type": "application/json"}
    json_d = {'ui_id': '1111', 'data': {'url': api_url}}
    response = requests.post("http://example.net/v3/doc", 
                             headers=headers, json=json_d)
    return response.text

df['res1'] = df['api_url'].apply(query_api)

0
user11727742 21 Дек 2019 в 07:20

2 ответа

Лучший ответ

Вам нужен аргумент для вашей функции query

Когда вы вызываете функцию apply, вы получаете pandas series и, исходя из значения аргумента axis, вы получаете row или column. Когда вы устанавливаете значение axis равным 1, вы получаете строку.

Итак, когда вы звоните

df['res'] = df[['uid','api_url']].apply(query, axis = 1)

Вы получаете каждую строку вашего фрейма данных в качестве аргумента функции запроса.

Поэтому вам нужно изменить функцию query на

def query(x):
    jso = {"id": x.uid,"docs": {"doc1":x.api_url,"type": "US","advanced": {"details":true}}} 
    json_d = json_dumps(jso)
    headers = {"Content-Type": "application/json"}
    response = requests.post("https://example.net/document",headers=headers,json=json_d)
    return response.text

Ваш второй случай query_api работает, потому что у него есть аргумент, и он будет столбцом вашего фрейма данных.

Надеюсь, это объяснение поможет.

P.S.

В вашем первом apply вызове у вас есть query() в качестве аргумента. Я предполагаю, что это была опечатка. Вам нужно только указать имя функции.

ИЗМЕНИТЬ

Я добавил пример для дальнейшего объяснения

>>> df
   uid  api_url
0    1  abc.com
1    2  xyz.com

>>> def query(x):
...     return str(x.uid) + x.api_url

>>> df.apply(query, axis =1)
0    1abc.com
1    2xyz.com
dtype: object
1
abhilb 21 Дек 2019 в 05:04

Это должно работать:

def query(x):
    jso = {"id": x.uid,"docs": {"doc1":x.api_url,"type": "US","advanced": {"details":true}}} 
    json_d = json_dumps(jso)
    headers = {"Content-Type": "application/json"}
    response = requests.post("https://example.net/document",headers=headers,json=json_d)
    return response.text

df['res'] = df.apply(query,axis = 1)
0
oppressionslayer 21 Дек 2019 в 05:01