根据另一个 Dataframe 中的条件组在Pandas Dataframe 中查找行

h5qlskok  于 2022-10-23  发布在  其他
关注(0)|答案(3)|浏览(192)

很抱歉,如果这是一个重复的问题,或者标题不好,我无法在一行中正确地表达我试图从一般意义上找到的东西,所以使用下面的例子来说明我想要做的事情。
我希望根据另一个 Dataframe 的最小值和最大值从 Dataframe 中获取某些行。最小值和最大值取决于分配的组:

data = {
    'Name': ['John', 'John', 'Sam', 'Sam', 'Tim', 'Tim'],
    'Salary': [18000, 20000, 15000, 35000, 12000, 30000]
} 

boundary = {
    'Name': ['John', 'Sam', 'Tim'],
    'Min': [19000, 18000, 10000],
    'Max': [21000, 30000, 32000]
}

data = pd.DataFrame(data, columns = ['Name', 'Salary'])
boundary = pd.DataFrame(boundary, columns = ['Name', 'Min', 'Max'])

我希望结果是下面的 Dataframe ,其中只保留数据df中距离边界df大于max和小于min的行。

Name    Salary
0   John    18000
2   Sam     15000
3   Sam     35000

我可以用一个最小/最大值来完成这项任务,但无法与参与的团队一起完成,请提前感谢。

enyaitl3

enyaitl31#

与查询合并

data.merge(boundary, how="left", on="Name").query("Salary > Max or Salary < Min")[["Name", "Salary"]]
sauutmhj

sauutmhj2#

一种方法可以是:

  • 首先,使用df.merge连接MinMax
  • 接下来,将Series.between与一元运算符(~)组合,以便反转结果(即,我们正在寻找边界之外的所有值)。
  • 最后,只保留列NameSalary,通过使用df.loc实现这一点,或者也可以使用i1j 3k1l。
res = data.merge(boundary, on='Name', how='left')
res = res.loc[~res.Salary.between(res.Min, res.Max, 
                                  inclusive='both'), ['Name', 'Salary']]
print(res)

   Name  Salary
0  John   18000
2   Sam   15000
3   Sam   35000
mzsu5hc0

mzsu5hc03#


小时
请务必回答这个问题。提供详细信息并分享您的研究成果!

相关问题