当结果重置每次迭代时,有没有办法将 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]))
如果我对您的问题有误,或者有什么我可以澄清的,请告诉我。
我正在查询 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]))
如果我对您的问题有误,或者有什么我可以澄清的,请告诉我。