【问题标题】:Is there a way to add the results of a for loop to a dataframe when the result resets each iteration?当结果重置每次迭代时,有没有办法将 for 循环的结果添加到数据帧?
【发布时间】:2019-06-21 10:23:31
【问题描述】:

我正在查询谷歌分析 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 循环调用时都会重置其列表。

【问题讨论】:

    标签: python for-loop google-analytics-api


    【解决方案1】:

    在我看来,这是因为您每次调用函数时都会覆盖 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 = [] 
    
        ...
    

    但是,您的第一个 sn-p 似乎是将这些较小的 Dataframes 一起收集到一个列表中,所以最后您有 Dataframes 的完整列表。在这种情况下,您可能只需循环通过 df_new 变量和用户 pandas.concat 将它们连接在一起。

    此外,您在第一个 sn-p 中似乎有一个不必要的任务。

    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]))
    

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

    【讨论】:

    • 谢谢,你说得对,使用 pd.concat 有效,我最终将每个数据帧附加到一个列表中,然后运行另一个 for 循环来 pd.concat 将它们一个接一个地连接在一起。
    猜你喜欢
    • 2015-03-19
    • 1970-01-01
    • 1970-01-01
    • 2013-11-17
    • 1970-01-01
    • 1970-01-01
    • 2021-02-04
    • 2020-05-09
    • 1970-01-01
    相关资源
    最近更新 更多