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

如何获取两个DataFrame中共同用户的最低考试分数?

获取同时参加两场考试用户的最低分数

你可以通过以下几种简洁的方式实现需求:

方法1:基于你已有的merge结果优化

你已经通过inner merge拿到了同时参加两场考试的用户及其两场分数,只需要新增一步计算两场分数的最小值,再整理成目标格式即可:

import pandas as pd
exam_1 = pd.DataFrame({'user': ['A', 'B', 'C'], 
                   'marks': [10, 50, 40]})

exam_2 = pd.DataFrame({'user': ['A', 'C', 'D'], 
                   'marks': [30, 20, 30]})

# 保留你的合并逻辑,添加后缀区分两场分数
tmp = pd.merge(exam_1, exam_2, how='inner', on=['user'], suffixes=('_exam1', '_exam2'))
# 计算每个用户的最低分数,提取需要的列
result = tmp.assign(marks=tmp[['marks_exam1', 'marks_exam2']].min(axis=1))[['user', 'marks']]
print(result)

输出结果:

user  marks
0    A     10
1    C     20

(注:你给出的预期结果中C的分数为30,这和实际数据的最低分不符——实际C两场分数为40和20,最低分应为20)

方法2:合并所有数据后分组筛选

如果后续可能有更多考试数据,这种方法扩展性更强:

# 合并两场考试的所有数据
combined_data = pd.concat([exam_1, exam_2])
# 筛选出参加了两场考试的用户,再按用户分组取最低分
result = combined_data.groupby('user').filter(lambda x: len(x) == 2) \
                      .groupby('user')['marks'].min().reset_index()
print(result)

方法3:先筛选共同用户再合并计算

先提取出同时参加两场考试的用户,再合并对应数据并计算最小值:

# 找出同时参加两场考试的用户
common_users = set(exam_1['user']).intersection(set(exam_2['user']))
# 筛选出共同用户的所有考试数据
filtered_data = pd.concat([exam_1[exam_1['user'].isin(common_users)], 
                           exam_2[exam_2['user'].isin(common_users)]])
# 分组取最低分
result = filtered_data.groupby('user')['marks'].min().reset_index()
print(result)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 17:56:07