如何根据另一DataFrame的限制条件删除pandas DataFrame行?
根据参赛次数限制筛选Pandas数据
需求说明
现有记录竞赛分数和参赛序号Entry_No的DataFrame df,以及存储每人最大允许参赛次数Limit的DataFrame df2,需要删除df中Entry_No超过对应人员限制的行,保留符合要求的数据。
示例数据
import pandas as pd # 生成参赛记录数据,包含姓名、分数和自动生成的参赛序号 df = pd.DataFrame({ 'Name': ['John', 'Jim', 'John','Jim', 'John','Jim','John','Jim','John','Jim','Jack','Jack','Jack','Jack'], 'Score': [10,8,9,3,5,0, 1, 2,3, 4,5,6,8,9] }) df['Entry_No'] = df.groupby(['Name']).cumcount() + 1 # 生成每人的参赛次数限制数据 df2 = pd.DataFrame({'Name': ['John', 'Jim', 'Jack'],'Limit': [2,3,1]})
解决方案
核心思路是先把每个人的参赛限制关联到主数据中,再进行筛选:
# 1. 合并两个DataFrame,将Limit匹配到对应人员的每一条参赛记录 merged = df.merge(df2, on='Name', how='left') # 2. 筛选出Entry_No不超过Limit的行,同时移除Limit列 result = merged[merged['Entry_No'] <= merged['Limit']].drop('Limit', axis=1) # 查看结果 print(result)
也可以用更简洁的链式写法:
result = df.merge(df2, on='Name').query('Entry_No <= Limit').drop('Limit', axis=1)
输出结果
运行后得到的符合要求的数据如下:
Name Score Entry_No 0 John 10 1 1 Jim 8 1 2 John 9 2 3 Jim 3 2 4 Jim 0 3 10 Jack 5 1
内容的提问来源于stack exchange,提问作者SOK
相关产品推荐
相关产品推荐

