首页 > 解决方案 > 在两个不同列上有两个条件的数据框

问题描述

我想根据两个不同列上的两个条件过滤数据框。在下面的示例中,我想过滤数据框df以包含行,以使其包含uids 且列的值计数val大于 4 大于 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 的行数大于或等于 2 的uid行。val

标签: pythonpandas

解决方案


您需要groupby.transform一次sum检查 val 大于或等于ge4 的位置。并检查结果是否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是对locvalge大于 4 的行和列 uid,value_counts在其上使用并在 2 处获得 True ge。然后map返回 uid 列以在 df 上创建布尔过滤器。相同的结果并且可能更快。

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

推荐阅读