如何根据另一个数据框中的条件提取 Pandas 数据框的行

3

I have these two dataframes :

df1 = pd.DataFrame({'Points':[1,2,3,4,5], 'ColX':[9,8,7,6,5]})
df1
    Points  ColX
0        1     9
1        2     8
2        3     7
3        4     6
4        5     5

df2 = pd.DataFrame({'Points':[2,5], 'Sum':[-1,1], 'ColY':[2,4]}) # ColY does not matter, I just added it to say that this dataframe can have other columns that the useful columns for this topic
df2
    Points  Sum  ColY
0        2   -1     2
1        5    1     4

我希望获得一个数据框,其中包含df1中以下条件的行:
  • df1中列Points的值也在df2的列Points中
  • df2中列Sum的值介于0和2之间
因此,我希望获得这个数据框(索引无关):
    Points  ColX
4        5     5

我试过以下的方法但它没有起作用:
df1[df1.merge(df2, on = 'Points')['Sum'] <= 2 and ['Sum']>=0] 

你能帮我找到正确的代码吗?

3个回答

3

试试这个:

df1[df1['Points'].isin(df2.query('0 <= Sum <= 2')['Points'])]

输出:

  Points  ColX
4       5     5

解释:

  • df2.query('0 <= Sum <=2') 用于筛选 df2 中有效的记录
  • 随后使用 isin 的布尔索引筛选 df2 的Points列。

感谢您提供详细的解决方案! - Ewdlam

1

也有效:

df3 = df1.merge(df2, on='Points')
result = df3[(df3.Sum >= 0) & (df3.Sum <= 2)]
result

感谢您的帮助! - Ewdlam

1

使用 Series.between 进行布尔掩码,使用 boolean indexing 进行过滤,然后将其传递到另一个使用 Series.isin 的掩码中:

df = df1[df1['Points'].isin(df2.loc[df2['Sum'].between(0,2), 'Points'])]
print (df)
   Points  ColX
4       5     5

您的解决方案应该使用 DataFrame.query 进行筛选:

df = df1.merge(df2, on = 'Points').query('0<=Sum<=2')[df1.columns]
print (df)
   Points  ColX
1       5     5

感谢您的帮助! - Ewdlam
1
@Ewdlam - 表示感谢的最好方式就是简单地点赞一个答案(或者像你已经做过的那样选择它作为答案)。这个想法是为了最小化噪音并最大化有用的内容。否则,几乎每个帖子都会有“感谢”评论。我们感谢您试图保持礼貌。 :-) - Jeff Learman

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接