Я использую импорт из потока данных Alteryx, который представляет собой один столбец, содержащий следующий целочисленный формат:
Чтение данных из alteryx автоматически преобразует их в фрейм данных.
searches = Alteryx.read("dataimport")
SUCCESS: reading input data "dataimport"
RxNorm_Id
0 99
1 161
2 167
3 168
4 197
... ...
6711 2562541
6712 2565823
6713 2566308
6714 2566416
6715 2571104
У меня есть цикл for, который просматривает URL-адреса и заменяет сегмент поиском.
for search in searches:
print(f"Scraping {search}")
url = f"https://rxnav.nlm.nih.gov/REST/rxcui/{search}/historystatus.json?caller=RxNav"
print(url)
Когда я пытаюсь запустить данные через цикл, он сначала начинается с имени заголовка.
Скрапинг RxNorm_Id https://rxnav.nlm.nih.gov/REST/rxcui/**RxNorm_Id**/historystatus.json?caller=RxNav
Я не совсем уверен, почему сначала используется заголовок, но, очевидно, это вызывает ошибку, потому что поиск не существует.
Если я попытаюсь изменить фрейм данных на список, он заключает каждый элемент в квадратную скобку. Такие как:
Info: Python (2): [[99], [161], [167], [168], [197], [272], [281], [376]]
searches = searches.values.tolist()
Scraping [99]
https://rxnav.nlm.nih.gov/REST/rxcui/[99]/historystatus.json?caller=RxNav
Если я жестко запрограммирую поиск как [99,161,167,168,197,272,281,376], мой цикл работает без проблем.
Как я могу получить исходный фрейм данных в этом формате? Или как я могу заставить функцию tolist не заключать каждое число в квадратные скобки.
Я понимаю, что мой источник данных защищен, и использование Alteryx не позволяет мне реплицировать источник данных. Но этой информации должно быть достаточно для решения проблемы.
Ниже приведен весь мой код, обрезанный для легкого воспроизведения:
from ayx import Alteryx
from numpy import dtype
import pandas as pd
import requests
searches = Alteryx.read("dataimport")
# searches = searches.values.tolist()
# for search in searches: attempt for the tolist() function
for search in [searches]:
print(f"Scraping {search}")
url = f"https://rxnav.nlm.nih.gov/REST/rxcui/{search}/historystatus.json?caller=RxNav"
print(url)
data = s.get(url,headers=headers).json() #results from second redirect
print(data)
a = data['rxcuiStatusHistory']['definitionalFeatures']
b = data['rxcuiStatusHistory']['attributes']
print(b)
rxcui = b['rxcui']
name = b['name']
print(rxcui)
print(name)
try:
baserxcui = a['ingredientAndStrength'][0]['baseRxcui']
basename = a['ingredientAndStrength'][0]['baseName']
print(baserxcui)
print(basename)
except KeyError:
baserxcui = rxcui
basename = name
print(baserxcui)
print(basename)
try:
bossrxcui = a['ingredientAndStrength'][0]['bossRxcui']
bossname = a['ingredientAndStrength'][0]['bossName']
print(bossrxcui)
print(bossname)
except KeyError:
bossrxcui = rxcui
bossname = name
print(bossrxcui)
print(bossname)
Вы можете просто взять первый элемент внутри поиска, поскольку поиск представляет собой список. Итак, ваш код становится примерно таким:
for search in searches:
print(f"Scraping {search[0]}")
url = f"https://rxnav.nlm.nih.gov/REST/rxcui/{search[0]}/historystatus.json?caller=RxNav"
print(url)
Или вы можете просто просто изменить
searches = searches.values.tolist()
к
searches = [i[0] for i in searches.values.tolist()]
Я сделал несколько ошибок в своем первом ответе. Пожалуйста, проверьте снова.
Спасибо, Эммануэль, второе решение сработало. Изменение индекса на 1 в первом решении помогло, но мне также пришлось выполнить поиск в [поиск].. в любом случае, вы меня туда привели, и я ценю это.
Это должно работать, но это не так, потому что формат списка недействителен для URL-адреса при использовании функции tolist().