当结果重置每次迭代时,有没有办法将 for 循环的结果添加到数据帧?

Is there a way to add the results of a for loop to a dataframe when the result resets each iteration?

我正在查询 google 分析 API 并使用 for 循环一次从多个视图获取数据。然后我有一个解析器函数将我的 JSON 结果解析为 pandas 数据帧。如果我打印函数结果,它会向我显示单个数据框中的每个结果,无论我查询多少视图。但是我无法将结果添加到新数据框或列出每次迭代。

我试过使用 while 循环

df_new = []
view_id_list = ['##', '##', '##'] 
while len(df_new) < len(view_id_list)
    df2 = df_new.append(((prase_response_single(response_data)[0]))

此代码是我的示例请求,它贯穿我的 view_id 列表,并为我单独提供每个列表的数据

for i in viewId_listUse:
    sample_request = {
        'viewId': i,
        'dateRanges': {
            'startDate': datetime.strftime(datetime.now() - timedelta(days=30), '%Y-%m-%d'),
            'endDate': datetime.strftime(datetime.now(), '%Y-%m-%d')
        },
        'dimensions': [{'name': 'ga:date'}],
        'metrics': [{'expression': 'ga:sessions'}]
    }
    response = api_client.reports().batchGet(
        body={
            'reportRequests': sample_request
        }).execute()

    response_data = response.get('reports', [])[0]
    print((prase_response_single(response_data)[0]))

此函数将JSON数据解析为pandas数据框,但每次调用时都会清除结果列表

def prase_response_single(report):

    """Parses and prints the Analytics Reporting API V4 response"""
    result_list = []

    data_csv = []
    data_csv2 = []

    header_row = []

    columnHeader = report.get('columnHeader', {})
    metricHeaders = columnHeader.get('metricHeader', {}).get('metricHeaderEntries', [])
    dimensionHeaders = columnHeader.get('dimensions', [])

    for dheader in dimensionHeaders:
        header_row.append(dheader)
    for mheader in metricHeaders:
        header_row.append(mheader['name'])

    rows = report.get('data', {}).get('rows', [])
    for row in rows:
        row_temp = []
        dimensions = row.get('dimensions', [])
        metrics = row.get('metrics', [])
        for d in dimensions:
            row_temp.append(d)
        for m in metrics[0]['values']:
            row_temp.append(m)
            data_csv.append(row_temp)

        if len(metrics) == 2:
            row_temp2 = []
            for d in dimensions:
                row_temp2.append(d)
            for m in metrics[1]['values']:
                row_temp2.append(m)
            data_csv2.append(row_temp2)

    result_df = pandas.DataFrame(data_csv, columns=header_row)
    result_list.append(result_df)
    if data_csv2 != []:
        result_list.append(pandas.DataFrame(data_csv2, columns=header_row))

    return result_list

使用打印功能,这是我收到的那种结果(有更多行,但这是一个格式示例)

 ga:date ga:sessions
0   20190522        1243
1   20190523        1167
2   20190524        1001

但是我似乎无法将这些单独的数据帧附加在一起,因为该函数每次被 for 循环调用时都会重置其列表。

在我看来,这是因为每次调用该函数时都会覆盖 result_list 变量。

def prase_response_single(report):

    """Parses and prints the Analytics Reporting API V4 response"""
    # Each time the function is called, this is overwritten as an empty list
    result_list = [] 

    ...

然而,您的第一个片段似乎是将这些较小的 Dataframes 一起收集到一个列表中,因此您在最后有完整的 Dataframes 列表。在那种情况下,您可能可以循环遍历 df_new 变量和用户 pandas.concat 以将它们连接在一起。

此外,您似乎在第一个代码段中进行了不必要的分配。

df_new = []
view_id_list = ['##', '##', '##'] 
while len(df_new) < len(view_id_list)
    # Don't need to re-assign the list, .append will mutate the existing list
    df_new.append(((prase_response_single(response_data)[0]))

如果我对您的问题有误,或者有什么我可以澄清的,请告诉我。