pandas 根据另一个 Dataframe 的条件删除panda Dataframe 中的行

f45qwnt8  于 2022-11-05  发布在  其他
关注(0)|答案(2)|浏览(300)

我有下面的数据框,其中包含了一个竞赛的分数,以及一个计算每个人参赛次数的列。

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
df

然后,我有另一个表,其中存储了每个人可以拥有的最大条目数的数据:

df2 = pd.DataFrame({'Name': ['John', 'Jim', 'Jack'],'Limit': [2,3,1]})
df2

我尝试根据df2中的每个人删除df中条目号大于Limit的行,因此我的预期输出如下:

如果有任何关于如何帮助我实现这一目标的想法,那将是非常棒的!谢谢

jjhzyzn0

jjhzyzn01#

您可以使用pandas.merge创建另一个 Dataframe ,并根据您的条件删除列:

df3 = pd.merge(df, df2, on="Name", how="left")
df3[df3["Entry_No"] <= df3["Limit"]][df.columns].reset_index(drop=True)
    Name  Score  Entry_No
0   John     10         1
1    Jim      8         1
2   John      9         2
3    Jim      3         2
4    Jim      0         3
5   Jack      5         1

我使用how="left"来保持dfreset_index(drop=True)的顺序,以重置生成的 Dataframe 的索引。

tsm1rwdh

tsm1rwdh2#

您可以对2个 Dataframe 执行join操作,然后在满足以下条件的情况下删除:

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]})
df2 = df2.set_index('Name')

df = df.join(df2, on='Name')
df.drop(df[df.Entry_No>df.Limit].index, inplace = True)

给出预期输出

相关问题