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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 16:54:21