在两个不同列上具有两个条件的数据帧

2024-04-27 13:00:44 发布

您现在位置:Python中文网/ 问答频道 /正文

我想根据两个不同列上的两个条件过滤数据帧。在下面的示例中,我希望过滤数据帧df以包含行,从而使其包含的uid的值计数大于4的val列大于2

df = pd.DataFrame({'uid':[1,1,1,2,2,3,3,4,4,4],'iid':[11,12,13,12,13,13,14,14,11,12], 'val':[3,4,5,3,5,4,5,4,3,4]})

对于这个数据帧,我的输出应该是

 df
   uid  iid  val
0    1   11    3
1    1   12    4
2    1   13    5
5    3   13    4
6    3   14    5
7    4   14    4
8    4   11    3
9    4   12    4

这里,我过滤掉了uid2,因为uid == 2val >= 4的行数小于2。我只想保留值大于4的uid行数大于或等于2的val


1条回答
网友
1楼 · 发布于 2024-04-27 13:00:44

您需要使用groupby.transformsum检查val大于或等于ge的地方。并检查结果是否为ge,以将其用作df上的布尔过滤器

print (df[df['val'].ge(4).groupby(df['uid']).transform(sum).ge(2)])
   uid  iid  val
0    1   11    3
1    1   12    4
2    1   13    5
5    3   13    4
6    3   14    5
7    4   14    4
8    4   11    3
9    4   12    4

编辑:另一种避免groupby.transform的方法是locval大于4的行和列uid,在其上使用value_counts,并在ge2处获得True。然后map返回uid列,在df上创建布尔过滤器。同样的结果,可能更快

df[df['uid'].map(df.loc[df['val'].ge(4), 'uid'].value_counts().ge(2))]

相关问题 更多 >