You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PySpark:如何从父DataFrame获取子集中对应行的全量字段?

从分组后的子DataFrame获取父DataFrame完整行的方法

以下是几种实用的实现方式(以Pandas为例):

1. 使用Merge(合并)操作

以子DataFrame中的gmail和max_age为匹配键,与父DataFrame做内连接,直接筛选出对应行的完整数据:

import pandas as pd

# 假设父DataFrame为parent_df,子DataFrame为child_df
result_df = pd.merge(parent_df, child_df, left_on=['gmail', 'age'], right_on=['gmail', 'max_age'], how='inner')
# 若不需要重复列,可删除max_age
result_df = result_df.drop(columns=['max_age'])

2. 直接在父DataFrame上用窗口函数处理(更高效)

无需预先生成子DataFrame,直接通过分组计算筛选出每个gmail组中年龄最大的行:

方法A:用transform计算组内最大年龄

# 新增列存储每个gmail组的最大年龄
parent_df['group_max_age'] = parent_df.groupby('gmail')['age'].transform('max')
# 筛选年龄等于组内最大年龄的行,再删除辅助列
result_df = parent_df[parent_df['age'] == parent_df['group_max_age']].drop(columns=['group_max_age'])

方法B:用rank函数标记排名

适合处理组内存在多个相同最大年龄的场景:

# 按gmail分组,年龄降序排名;method='first'保留最先出现的行,method='min'保留所有同最大年龄的行
parent_df['age_rank'] = parent_df.groupby('gmail')['age'].rank(ascending=False, method='first')
# 筛选排名为1的行,删除辅助列
result_df = parent_df[parent_df['age_rank'] == 1].drop(columns=['age_rank'])

3. 用元组集合匹配(小数据量适用)

将子DataFrame的(gmail, max_age)转换为元组集合,逐行匹配父DataFrame:

# 生成匹配键的元组集合
match_keys = set(zip(child_df['gmail'], child_df['max_age']))
# 筛选符合条件的行
result_df = parent_df[parent_df.apply(lambda x: (x['gmail'], x['age']) in match_keys, axis=1)]

内容的提问来源于stack exchange,提问作者Nisha naik

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 10:25:22