如何基于已有DataFrame在Pandas中实现指定BigQuery查询逻辑?
在Pandas中实现GA4 BigQuery查询逻辑
以下是对应你提供的BigQuery查询逻辑的Pandas分步实现,每一步都匹配原SQL的核心操作:
1. 生成去重标识 dedup_id
对应BigQuery中row_number() over(partition by user_pseudo_id, event_timestamp, event_name),为每组用户、事件时间、事件名称生成从1开始的序号:
df['dedup_id'] = df.groupby(['user_pseudo_id', 'event_timestamp', 'event_name']).cumcount() + 1
2. 展开 event_params 数组
对应BigQuery的unnest(event_params),先展开嵌套的参数列表,再解析参数中的key和value子字段(假设event_params是包含字典的列表结构):
# 展开event_params列表 df_exploded = df.explode('event_params').reset_index(drop=True) # 解析参数的key值 df_exploded['event_param_key'] = df_exploded['event_params'].apply(lambda x: x.get('key')) # 解析value下的各类型字段 df_exploded['string_value'] = df_exploded['event_params'].apply(lambda x: x.get('value', {}).get('string_value')) df_exploded['int_value'] = df_exploded['event_params'].apply(lambda x: x.get('value', {}).get('int_value')) df_exploded['float_value'] = df_exploded['event_params'].apply(lambda x: x.get('value', {}).get('float_value')) df_exploded['double_value'] = df_exploded['event_params'].apply(lambda x: x.get('value', {}).get('double_value'))
3. 提取 ga_session_id
对应BigQuery的case when逻辑,仅当参数key为ga_session_id时提取其整数型值:
df_exploded['ga_session_id'] = df_exploded.apply( lambda row: row['int_value'] if row['event_param_key'] == 'ga_session_id' else None, axis=1 )
4. 按事件维度填充统一的 ga_session_id
对应BigQuery的max(ga_session_id) over (partition by event_timestamp,event_name),为同一事件时间和名称的分组填充统一的session ID:
df_exploded['ga_session_id'] = df_exploded.groupby(['event_timestamp', 'event_name'])['ga_session_id'].transform('max')
5. 生成关联键 join_key
拼接用户伪ID、事件时间、事件名称和去重ID,生成唯一关联键:
# 统一转为字符串后拼接 df_exploded['join_key'] = ( df_exploded['user_pseudo_id'].astype(str) + df_exploded['event_timestamp'].astype(str) + df_exploded['event_name'] + df_exploded['dedup_id'].astype(str) )
6. 整理最终结果
移除原始的event_params数组字段,保留所有处理后的字段:
final_df = df_exploded.drop(columns=['event_params'])
内容的提问来源于stack exchange,提问作者kirti
相关产品推荐
相关产品推荐

