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
相关产品推荐
相关产品推荐

