如何获取两个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
相关产品推荐
相关产品推荐

