我编写了一个循环,用于根据ID列表从API(Limesurvey)检索数据,并使用每个循环的结果填充数据帧的一行。
我有一个ID如下的列表:
# list of ids
ids = ['1','427',... ,'847']
我用于基于列表的每个项目查询API的代码如下:
method = "get_participant_properties"
params = OrderedDict([
("sSessionKey", api.session_key),
("iSurveyID", 12345),
("aTokenQueryProperties", t),
])
# loop through API query with the 'aTokenQueryProperties' stored in the list 'tids'.
attributes = []
for t in ids:
attributes.append(api.query(method=method, params=params))
pd.DataFrame(attributes)
不幸的是,结果是一个具有158行的数据帧,并且每一行都是相同的,即我列表中最后一个ID的查询结果(847)。
答案 0 :(得分:2)
您没有从循环中传入t
。 t
定义中的params
是无关的;如果我现在要运行您的代码,我会得到一个NameError
异常,因为此时尚未设置t
。 t
映射中的params
表达式不是实时的,不会在每次循环迭代时更新。
在循环中设置'aTokenQueryProperties'
键 :
method = "get_participant_properties"
params = OrderedDict([
("sSessionKey", api.session_key),
("iSurveyID", 12345),
("aTokenQueryProperties", None),
])
attributes = []
for t in ids:
params["aTokenQueryProperties"] = t
attributes.append(api.query(method=method, params=params))
在开始时将"aTokenQueryProperties"
None
对象中的params
设置为OrderedDict
是可选的;仅在保留params
顺序的确切位置很重要的情况下才需要执行此操作,即使那样,因为在您的示例中,它是映射中的 last 元素,您需要最终还是得到相同的输出。