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写作工具

下载

以下是实现此目标的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重构的技术是一种值得考虑的通用方法。

相关专题

更多
python开发工具
python开发工具

php中文网为大家提供各种python开发工具,好的开发工具,可帮助开发者攻克编程学习中的基础障碍,理解每一行源代码在程序执行时在计算机中的过程。php中文网还为大家带来python相关课程以及相关文章等内容,供大家免费下载使用。

769

2023.06.15

python打包成可执行文件
python打包成可执行文件

本专题为大家带来python打包成可执行文件相关的文章,大家可以免费的下载体验。

661

2023.07.20

python能做什么
python能做什么

python能做的有:可用于开发基于控制台的应用程序、多媒体部分开发、用于开发基于Web的应用程序、使用python处理数据、系统编程等等。本专题为大家提供python相关的各种文章、以及下载和课程。

764

2023.07.25

format在python中的用法
format在python中的用法

Python中的format是一种字符串格式化方法,用于将变量或值插入到字符串中的占位符位置。通过format方法,我们可以动态地构建字符串,使其包含不同值。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

659

2023.07.31

python教程
python教程

Python已成为一门网红语言,即使是在非编程开发者当中,也掀起了一股学习的热潮。本专题为大家带来python教程的相关文章,大家可以免费体验学习。

1325

2023.08.03

python环境变量的配置
python环境变量的配置

Python是一种流行的编程语言,被广泛用于软件开发、数据分析和科学计算等领域。在安装Python之后,我们需要配置环境变量,以便在任何位置都能够访问Python的可执行文件。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

549

2023.08.04

python eval
python eval

eval函数是Python中一个非常强大的函数,它可以将字符串作为Python代码进行执行,实现动态编程的效果。然而,由于其潜在的安全风险和性能问题,需要谨慎使用。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

579

2023.08.04

scratch和python区别
scratch和python区别

scratch和python的区别:1、scratch是一种专为初学者设计的图形化编程语言,python是一种文本编程语言;2、scratch使用的是基于积木的编程语法,python采用更加传统的文本编程语法等等。本专题为大家提供scratch和python相关的文章、下载、课程内容,供大家免费下载体验。

730

2023.08.11

AO3中文版入口地址大全
AO3中文版入口地址大全

本专题整合了AO3中文版入口地址大全,阅读专题下面的的文章了解更多详细内容。

1

2026.01.21

热门下载

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

精品课程

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

共4课时 | 11.2万人学习

Django 教程
Django 教程

共28课时 | 3.3万人学习

SciPy 教程
SciPy 教程

共10课时 | 1.2万人学习

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

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