0

0

从Google API响应对象高效创建Pandas DataFrame教程

聖光之護

聖光之護

发布时间:2025-10-10 13:09:01

|

444人浏览过

|

来源于php中文网

原创

从Google API响应对象高效创建Pandas DataFrame教程

本教程详细介绍了如何将Google Analytics Admin API返回的ListCustomDimensionsPager对象转换为Pandas DataFrame。由于API响应的特定对象类型无法直接序列化,文章提供了一种通过迭代响应、将对象字典转换为字符串,并进行一系列字符串替换以构造有效JSON,最终生成结构化DataFrame的实用方法。

理解Google API响应的挑战

在使用pythongoogle analytics admin api交互时,例如调用admin_v1beta.analyticsadminserviceclient().list_custom_dimensions方法,返回的结果并非标准的python列表或字典,而是一个listcustomdimensionspager类型的对象。这种对象类型旨在提供分页功能,但其内部结构不直接兼容pandas dataframe的创建或标准的json序列化过程。

在尝试直接处理这类API响应时,我们通常会遇到以下问题:

  • 非JSON序列化: 直接尝试使用json.dumps()序列化ListCustomDimensionsPager对象或其__dict__属性会导致TypeError: Object of type _GapicCallable is not JSON serializable。这是因为该对象内部包含了一些不可序列化的Gapic客户端方法。
  • 非直接可下标访问: 尝试像访问字典一样通过键(例如ga4_custom_dimensions['custom_dimensions'])来获取数据会引发TypeError: ListCustomDimensionsPager' object is not subscriptable,因为它不是一个字典类型。
  • pd.json_normalize的局限性: 即使尝试使用Pandas的json_normalize方法,也往往只能得到一个仅包含索引的空DataFrame,无法正确解析嵌套数据。

这些挑战使得直接将API响应转换为Pandas DataFrame变得复杂。

解决方案:通过字符串操作构建有效JSON

鉴于API响应对象的特殊性,一种有效的解决方案是手动解析其内部结构,并通过字符串处理将其转换为Pandas能够识别的JSON格式。核心思想是迭代ListCustomDimensionsPager对象中的每个元素,将每个元素转换为一个可序列化的字典表示,然后将其添加到列表中,最终用该列表创建DataFrame。

零沫AI工具导航
零沫AI工具导航

零沫AI工具导航-AI导航新标杆,探索全球实用AI工具

下载

以下是实现此目标的Python函数:

import pandas as pd
import json
from google.analytics.admin import admin_v1beta # 确保已安装 google-analytics-admin 库

def get_custom_dimensions_as_dataframe(property_filter: str) -> pd.DataFrame:
    """
    从Google Analytics Admin API获取自定义维度列表,并将其转换为Pandas DataFrame。

    Args:
        property_filter: Google Analytics 属性的资源名称,例如 "properties/12345"。

    Returns:
        一个包含自定义维度数据的Pandas DataFrame。
    """
    client = admin_v1beta.AnalyticsAdminServiceClient()

    request = admin_v1beta.ListCustomDimensionsRequest(
        parent=property_filter
    )

    # API响应是一个ListCustomDimensionsPager对象
    full_response_pager = client.list_custom_dimensions(request=request)

    df_records = []

    # 迭代Pager对象中的每个自定义维度响应
    for response_item in full_response_pager:
        # 1. 获取响应项的内部字典表示
        # response_item本身是一个Google Protobuf消息对象,其__dict__包含了实际的数据
        step1 = response_item.__dict__

        # 2. 将字典转换为字符串,这是进行字符串替换的基础
        step2 = str(step1)

        # 3. 执行一系列字符串替换,将非标准的Python字典字符串转换为有效的JSON字符串
        # 目标是将 `key: value` 转换为 `"key": "value"` 或 `"key": value`
        # 确保键名和字符串值被双引号包围,布尔值和数字保持其JSON原生格式。
        step3 = step2.replace(': name:', ': "name" :')
        step4 = step3.replace('parameter_name:', ', "parameter_name" :')
        step5 = step4.replace('display_name:', ', "display_name" :')
        step6 = step5.replace('description:', ', "description" :')
        step7 = step6.replace('scope:', ', "scope" :')
        # 处理布尔值和枚举值,确保它们是有效的JSON值
        # 注意:JSON中布尔值 'true' 或 'false' 不需要引号
        step8 = step7.replace('disallow_ads_personalization: true', ', "disallow_ads_personalization" : true')
        step9 = step8.replace("'_pb': ", "") # 移除内部Protobuf对象的引用,通常不需要
        step10 = step9.replace(' : EVENT', ' : "EVENT"') # 枚举值转换为字符串,需要引号
        step11 = step10.replace(' : USER', ' : "USER"')   # 枚举值转换为字符串,需要引号

        # 4. 处理Unicode转义字符并确保编码正确
        # .encode('utf-8').decode('unicode_escape') 用于正确处理字符串中的特殊字符,
        # 例如 \uXXXX,将其转换为实际的Unicode字符,确保json.loads()能正确解析。
        step12 = step11.encode('utf-8').decode('unicode_escape')

        # 5. 将处理后的字符串加载为Python字典
        # 此时,字符串已经是一个有效的JSON格式
        try:
            step13 = json.loads(step12)
            df_records.append(step13)
        except json.JSONDecodeError as e:
            print(f"Error decoding JSON for item: {step12[:200]}... Error: {e}")
            # 在生产环境中,可能需要更健壮的错误处理机制

    # 6. 从字典列表创建Pandas DataFrame
    return pd.DataFrame(df_records)

代码解析与注意事项

  1. 迭代ListCustomDimensionsPager: full_response_pager是一个可迭代对象。通过for response_item in full_response_pager:,我们可以逐一访问每个自定义维度对象。
  2. 访问__dict__: response_item.__dict__尝试获取API响应对象的内部字典表示。对于Google Protobuf消息对象,__dict__通常包含了其字段数据。
  3. str()转换: 将字典转换为字符串 (str(step1)) 是为了能够使用str.replace()方法进行字符串操作。
  4. 一系列str.replace()操作:
    • 键名加引号: 原始字符串中,键名(如name、parameter_name)没有双引号,不符合JSON规范。通过替换,例如将: name: 替换为: "name" :,为键名添加双引号。
    • 值加引号: 对于字符串类型的值(如枚举值EVENT、USER),原始输出可能没有双引号,需要手动添加,例如将: EVENT 替换为: "EVENT"。
    • 布尔值处理: JSON中布尔值true或false是小写的字面量,不需要引号。例如,disallow_ads_personalization: true被替换为, "disallow_ads_personalization" : true,确保true不被错误地加上引号。
    • _pb字段清理: "_pb":通常是Protobuf内部的私有字段,可能包含不可序列化的对象,直接移除可以简化后续处理。
    • 逗号添加: 原始字符串中,字段之间可能没有逗号,或者逗号位置不正确。通过在替换时巧妙地添加逗号(例如 , "parameter_name" :),确保了JSON结构的正确性。
  5. encode('utf-8').decode('unicode_escape'): 这一步是为了正确处理字符串中的Unicode转义序列(例如\uXXXX),将其转换为实际的Unicode字符,确保json.loads()能正确解析。
  6. json.loads(): 当字符串经过上述处理后,它已经是一个有效的JSON字符串,可以安全地通过json.loads()方法转换为Python字典。
  7. 构建DataFrame: 将所有解析出的字典收集到一个列表df_records中,最后使用pd.DataFrame(df_records)即可创建最终的DataFrame。

使用示例

# 替换为您的Google Analytics 4属性ID
# 例如,如果您的属性ID是 123456789,那么 property_resource_name 就是 "properties/123456789"
property_id = "YOUR_GA4_PROPERTY_ID" 
property_resource_name = f"properties/{property_id}"

# 调用函数获取DataFrame
custom_dimension_df = get_custom_dimensions_as_dataframe(property_resource_name)

# 打印DataFrame的头部信息
print("DataFrame头部信息:")
print(custom_dimension_df.head())

# 打印DataFrame的类型和形状
print(f"\nDataFrame类型: {type(custom_dimension_df)}")
print(f"DataFrame形状: {custom_dimension_df.shape}")

总结

将Google Analytics Admin API返回的ListCustomDimensionsPager对象转换为Pandas DataFrame需要一个间接的方法。由于该对象不直接支持JSON序列化或字典式访问,我们采用了一种通过迭代、字符串转换和细致的字符串替换来构造有效JSON字符串的策略。尽管这种方法可能显得不够“优雅”,但它提供了一个实用且有效的解决方案,能够成功地将复杂的API响应数据转化为结构化的Pandas DataFrame,以便于后续的数据分析和处理。在处理类似非标准API响应时,这种字符串处理和JSON重构的技术是一种值得考虑的通用方法。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

WorkBuddy
WorkBuddy

腾讯云推出的AI原生桌面智能体工作台

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
json数据格式
json数据格式

JSON是一种轻量级的数据交换格式。本专题为大家带来json数据格式相关文章,帮助大家解决问题。

457

2023.08.07

json是什么
json是什么

JSON是一种轻量级的数据交换格式,具有简洁、易读、跨平台和语言的特点,JSON数据是通过键值对的方式进行组织,其中键是字符串,值可以是字符串、数值、布尔值、数组、对象或者null,在Web开发、数据交换和配置文件等方面得到广泛应用。本专题为大家提供json相关的文章、下载、课程内容,供大家免费下载体验。

549

2023.08.23

jquery怎么操作json
jquery怎么操作json

操作的方法有:1、“$.parseJSON(jsonString)”2、“$.getJSON(url, data, success)”;3、“$.each(obj, callback)”;4、“$.ajax()”。更多jquery怎么操作json的详细内容,可以访问本专题下面的文章。

337

2023.10.13

go语言处理json数据方法
go语言处理json数据方法

本专题整合了go语言中处理json数据方法,阅读专题下面的文章了解更多详细内容。

82

2025.09.10

Python 时间序列分析与预测
Python 时间序列分析与预测

本专题专注讲解 Python 在时间序列数据处理与预测建模中的实战技巧,涵盖时间索引处理、周期性与趋势分解、平稳性检测、ARIMA/SARIMA 模型构建、预测误差评估,以及基于实际业务场景的时间序列项目实操,帮助学习者掌握从数据预处理到模型预测的完整时序分析能力。

80

2025.12.04

Python 数据清洗与预处理实战
Python 数据清洗与预处理实战

本专题系统讲解 Python 在数据清洗与预处理中的核心技术,包括使用 Pandas 进行缺失值处理、异常值检测、数据格式化、特征工程与数据转换,结合 NumPy 高效处理大规模数据。通过实战案例,帮助学习者掌握 如何处理混乱、不完整数据,为后续数据分析与机器学习模型训练打下坚实基础。

32

2026.01.31

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

760

2023.08.03

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

221

2023.09.04

TypeScript类型系统进阶与大型前端项目实践
TypeScript类型系统进阶与大型前端项目实践

本专题围绕 TypeScript 在大型前端项目中的应用展开,深入讲解类型系统设计与工程化开发方法。内容包括泛型与高级类型、类型推断机制、声明文件编写、模块化结构设计以及代码规范管理。通过真实项目案例分析,帮助开发者构建类型安全、结构清晰、易维护的前端工程体系,提高团队协作效率与代码质量。

1

2026.03.13

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
最新Python教程 从入门到精通
最新Python教程 从入门到精通

共4课时 | 22.5万人学习

Django 教程
Django 教程

共28课时 | 5万人学习

SciPy 教程
SciPy 教程

共10课时 | 1.9万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号