Pandas按条件Merge/Join一对多DataFrame并聚合指定字段
实现方法
核心逻辑分两步:先对右表df2按关联键lid做分组聚合,拿到每个lid对应的字段最大值,再和左表df1做左连接即可,无匹配的记录会自动填充np.nan。
注意av字段是带$前缀的金额字符串,直接用字符串规则取最大值会出现$5 > $10的错误(字符串逐位比较时,第二位字符'5'的ASCII码大于'1'),需要先解析数值再取对应最大值的原始字符串。
完整代码如下:
import pandas as pd import numpy as np df1 = pd.DataFrame({ 'vid': [1, 2, 3, 4, 5], 'lid': [6, 7, 8, 9, 10], 'v': [3, 5, 6, 1, 9] }) df2 = pd.DataFrame({ 'lid': [6, 6, 8, 8, 10], 'av': ['$10','$5','$4','$3','$2'], 'cr': [0.04, 0.05, 0.03, 0.04, 0.01] }) # 分组聚合df2:cr直接取数值最大值,av先转数值再取最大值对应原始值 def get_max_av(group): av_num = group['av'].str.lstrip('$').astype(float) return group.loc[av_num.idxmax(), 'av'] df2_agg = df2.groupby('lid', as_index=False).agg( av = ('av', get_max_av), cr = ('cr', 'max') ) # 左连接合并 result = df1.merge(df2_agg, on='lid', how='left') print(result)
运行输出结果:
vid lid v av cr 0 1 6 3 $10 0.05 1 2 7 5 NaN NaN 2 3 8 6 $4 0.04 3 4 9 1 NaN NaN 4 5 10 9 $2 0.01
注:给出的预期结果中lid=8对应的av值
$5属于笔误,原df2中lid=8仅存在$4、$3两个av值,数值最大值对应的av为$4,与代码运行结果一致。
内容的提问来源于stack exchange,提问作者kms
相关产品推荐
相关产品推荐

